Chapter overview
In this chapter, I focus on the second of my three key questions about the development of representations of mental life: How are the conceptual units that anchor representations of mental life organized in relation to each other, and how does this organization change over development? As in Chapter III, to address this question I draw on data from all of the current studies (Studies 1-4); for details about the methods of these studies, see Chapter II. The goal of this chapter is to provide “snapshots” of the organization of conceptual units in early childhood, middle childhood, and adulthood.
General analysis plan
High-level overview
In this chapter, I examine the relationships among the “conceptual units” identified in Chapter III. How does a participant’s assessment of one conceptual unit for a particular target character (e.g., the degree to which he or she indicates that a beetle is capable of the physiological sensations of the BODY) affect that participant’s assessments of other conceptual units for that target character (e.g., his or her assessment of the beetle’s capacities in the domains of HEART or MIND)?
I focus in particular on the possibility that the mental capacity attributions documented by the studies included in this dissertation—re-analyzed as indicators of the broader “conceptual units” identified in Chapter III—might shed light on the hierarchical organization of these conceptual units, i.e., which conceptual units might be more basic or fundamental vs. more complex, and whether any of these conceptual units might or might not be considered to depend on the presence of others. In Chapter II, I illustrated this with the following example: If many participants endorse capacities associated with Conceptual Unit A without endorsing capacities associated with Conceptual Unit B, but very few participants do the reverse (endorsing capacities associated with Conceptual Unit B but not Conceptual Unit A), this provides some evidence that Conceptual Unit A is more basic or fundamental than Conceptual Unit B, or that Conceptual Unit B somehow depends on (perhaps requires) Conceptual Unit A.
Here I will translate this general interest in the relationships among conceptual units, as well as the specific intuition about how to detect the kinds of asymmetries that would be the signature of hierarchical relationships, into a specific analysis plan to be applied to each of these datasets in turn.
Details of analyses
Unlike the previous chapter, in which I employed a canonical approach to identifying latent constructs through analyses of correlation structures—exploratory factor analysis (EFA)—in this chapter there is no tried-and-true method for meeting my analysis goals. Instead, I chart my own course through these datasets, using the EFA solutions reported in Chapter II to score participants’ endorsements of each conceptual unit for the particular target character(s) that they assessed, examining holistic visualizations of the relationships among these endorsements, and then conducting more targeted regression analyses of difference scores between conceptual units as one index of asymmetrical (and possibly hierarchical) relationships between conceptual units.
Scoring endorsements of conceptual units
The first step in these analyses is to transform participants’ ratings of individual mental capacities into “scores” that indicate the extent to which they endorsed a particular conceptual unit for the target character(s) that they were assigned to assess. To do this, I make use of the EFAs presented in Chapter III—which originally served to identify a set of conceptual units in a particular sample—to a new end: the construction of “scales” for each of these conceptual units. Scale construction is a common use of EFA and similar dimensionality reduction analyses (if anything, more common than using EFA to make the kinds of theoretical arguments featured in Chapter II).
For each EFA solution, I construct a scale for each of the factors (conceptual units) identified by that solution. First, I sort each of the mental capacities included in that study into categories based on their loadings on each of the factors in that solution. For each mental capacity, I identify the “dominant” factor as the factor with the largest positive factor loading. For example, if the mental capacity feel happy had loadings of 0.60 on the BODY factor, 0.70 on the HEART factor, and 0.30 on the MIND factor, I would sort it into the HEART category. For each factor, I take the six highest-loading items as a candidate scale, then “drop” the capacities with the smallest factor loadings on their respective dominant factors until I have the same number of mental capacities in each category. For example, if the BODY factor were the dominant factor for nine mental capacities, the HEART factor for six capacities, and the MIND factor for five capacities, for each factor I would keep only the capacities with the five highest positive loadings on that factor, in order to construct three scales of equal length (and a maximum length of six items).
To calculate scores on these scales, I take the average of all of mental capacities for each scale, rescaling scores to range from 0 to 1 to facilitate comparison across studies. This yields a dataset in which each participant is associated with one score (between 0 and 1) for each of the conceptual units identified in the relative EFA solution, for each of the target characters that that participant assessed.
In this chapter, I apply this method to all of the three-factor solutions for adult samples as presented in Chapter III (Studies 1-4), yielding BODY, HEART, and MIND scores for each target character as assessed by each participant. (I ignore the aberrant four-factor solution for adults in Study 2 suggested by one of the three factor retention protocols considered in that chapter, since this was the only study out of the seven considered in which a four-factor solution appeared to add any value beyond the robust BODY-HEART-MIND framework common to all studies. [XX APPENDIX B?])
I use these three-factor adult solutions to assess datasets from both adults and children, allowing me to explore the relationships among a “mature” set of conceptual units (on the assumption that, over development, children will ultimately come to a consensus with the adults in their cultural context).
For the first sample of “older” children (7-9y of age, Study 2), I also briefly consider a second set of conceptual units: BODY, HEART, and MIND as defined by EFAs of the children’s own responses (rather than adults’ responses). Because the EFAs for older children and adults are so similar (see Chapter II and Table 4.10), the outcomes of these two approaches to constructing BODY, HEART, and MIND scales to yield very similar results in this age group. (Indeed, for the second sample of “older” children, Study 3, the scales that would emerge from EFA of their responses are identical to the scales that emerge from EFA of adult responses, with the exception of a single item on the BODY scale; see Table 4.10.)
For “younger” children (4-6y of age, Study 3; 4-5y of age, Study 4), I have chosen not to examine the various sets of two to four conceptual units that would be defined by EFAs of children’s own responses. As discusseed at length in Chapter II, EFAs of younger children’s responses were less robust and reliable than those of older children or adults, with different factor retention protocols generating different EFA solutions. For the purposes of the current chapter, this would mean assessing multiple additional sets of conceptual units for each of these samples. I have chosen to prioritize comparability across samples and studies over completeness in the main text of this chapter; the interested reader can find these alternative analyses in Appendix B [XX DO I WANT TO DO THIS?].
It is important to note that this is far from the only way to approach “scoring” participants on these conceptual units. For example, instead of constructing scales to capture each conceptual unit, I could have examined factor scores—summaries of each factor (conceptual unit) based on a participant’s responses to all mental capacities and the relationships between all mental capacities and all factors included in that EFA solution. However, much like z-scores, factor scores indicate where a participant falls in relation to other participants in the sample, and do not provide the kind of absolute score that is key to my goal in this chapter, which is to analyze relationships among factors in terms of the extent to which individual participants indicated that target characters “possessed” the conceptual units BODY, HEART, and MIND, and to compare these scores across samples and studies (rather than only across participants within a sample). [XX APPENDIX B?]
Even within the “scale” approach described in this section, there are many parameters of this analysis that I could have set differently. For example, I could have considered absolute factor loadings rather than raw factor loadings, which would allow for mental capacities that loaded especially strongly negatively on a particular factor to contribute (negatively) to scores on that conceptual unit; I could have omitted the step of making the scales for all factors within a single EFA solution equal length; I could have chosen to use only the top four or five (rather than six) mental capacities across all EFA solutions, or to set no limit on the number of items in a scale; or I could have implemented absolute thresholds for how strongly a mental capacity must load on a factor in order to count toward the score for that conceptual unit, or absolute limits on the degree to which a mental capacity can “cross-load” on non-dominant factors and still count toward the score for any one conceptual unit. [XX APPENDIX B?] However, these kinds of details differ quite dramatically across studies and age groups. For example, in some samples there are no strong negative factor loadings, and in others there are; if I considered absolute loadings rather than raw loadings, I could end up comparing scores from a “bipolar” scale in one sample to scores from a “unipolar” scale in another sample, making the comparison more difficult to interpret. Likewise, some EFA solutions tended to feature generally weaker factor loadings than others; if I were to impose absolute thresholds for the strength of factor loadings, I could end up comparing scores from scales of wildly different lengths across samples. In my view, the analysis decisions outlined above maximize comparability across studies and age groups—the primary goal of this chapter. (Note, however, that in the analysis code for this chapter I have included easy short cuts for the interested reader to explore different options for each of these parameters.)
Visualizing relationships
After constructing scales to capture participants’ endorsement of each conceptual unit, my next step is to characterize the relationships among scores on these three scales (BODY, HEART, and MIND). This is a truly exploratory endeavor: At the outset of this work, I had no strong hypotheses about these relationships, and only high-level intuitions about which aspects of these relationships would be of greatest interest in understanding the conceptual representations of interest. Accordingly, I begin each section with a holistic visualization of the relationships between the three pairs of conceptual units, presenting scatterplots of participants’ scores on each pair of scales (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND) and offering informal descriptions of what I consider to be the most striking features of these scatterplots. In addition to motivating my subsequent formal analyses, these informal descriptions are intended to guide future research targeting additional aspects of the relationships among conceptual units that are outside of the scope of the current dissertation.
Formal analyses of asymmetries
As I described in the theoretical overview of this dissertation (Chapter I [XX CHECK THIS IS TRUE]) and the opening of this chapter, one aspect of the relationships among conceptual units that is of particular interest to me is the possibility of asymmetries in these relationships. Were participants more likely to attribute BODY without HEART, or HEART without BODY? What about BODY vs. MIND, or HEART vs. MIND? Such asymmetries might reveal which conceptual units are more basic or fundamental, whether any of these conceptual units might be considered to depend on the presence of others—in other words, whether conceptual representations (in any particular sample) might be characterized by a hierarchical structure among conceptual units. Likewise, age-related differences in the direction or strength of these asymmetries might hint at developmental changes in these hierarchical structures over early and middle childhood.
Guided by this theoretical interest, the last step in my analyses in this chapter is to examine differences between scores on the BODY, HEART, and MIND scales. For each pair of conceptual units (e.g., BODY vs. HEART), I calculate a simple difference between scores on these two scales (in this case, subtracting participants’ HEART scores from their BODY scores). In the visualizations described in the previous section, this corresponds to the perpendicular distance between a particular datapoint and the line of equivalence (\(y = x\)). (The directions of these difference scores were chosen arbitrarily; e.g., I could have chosen to subtract participants’ BODY scores from their HEART scores.)
Here I describe my principles for interpreting these difference scores. A summary of these difference scores across all samples and studies can be found at the end of this chapter (Figure 4.10, panel A).
In my view, difference scores close to zero provide no evidence for or against a hierarchical relationship between conceptual units. This is illustrated most dramatically by the fact that a difference score of zero could occur if a participant attributes very little in the way of mental life to a particular target character (e.g., an inert object) or if a participant attributes maximal mental life to a particular target character (e.g., an adult human)—in either case, this would yield difference scores of zero for any pair of conceptual units. Even if a participant endorses two conceptual units to a middling degree (e.g., indicating that a beetle has middling capacities in both the BODY and MIND domains), I would not consider this evidence against a possible hierarchical relationship between the conceptual units in question.
Meanwhile, if participants within a sample have radically divergent difference scores—e.g., if roughly half of participants have much higher HEART than MIND scores and roughly half have much lower HEART than MIND scores—I interpret this as some evidence against systematic hierarchical relationships between the conceptual units in question.
It is only an abundance of non-zero difference scores running in the same direction for many participants within a sample that, in my view, provides evidence for systematic hierarchies among the conceptual units. This degree of consensus across participants in the direction of asymmetry between endorsements of two conceptual units is particularly significant in these datasets because these studies were designed with the express purpose of eliciting variability in mental capacity attributions across participants—either by asking participants about “edge cases” (a beetle, a robot), whose particular mental capacity profiles are likely to be the subject of disagreement across individuals; or by asking different participants to consider a variety of “diverse characters” (including inert objects, technologies, and a wide range of animals and humans), whose mental capacity profiles are likely considered to vary dramatically. (See Chapter II for further discussion of these two variants of the experimental approach.) Differences in individual participants’ knowledge, experience, and opinions, and differences in the target characters assessed by different participants, were key features of the design of these studies; it was critical to the success of the EFAs presented in Chapter III that participants varied in the degree to which they endorsed particular mental capacities. If, despite this variability, participants nonetheless converge on a same pattern of relative endorsements across two conceptual units—e.g., if most participants endorse capacities included in the MIND scale more strongly than they endorse capacities included in the HEART scale, regardless of the absolute strength of these endorsements—this provides some evidence of a common conceptual framework that places these conceptual units in asymmetrical, perhaps hierarchical, relation to one another.
To operationalize these principles and test for consensus in the direction of difference scores between any two conceptual units, I compare difference scores to zero via Bayesian regressions, using the “brms” package for R [XX CITE]. I conduct a separate regression analysis for each pair of conceptual units, accounting for differences between target characters (effect-coded so as to center the intercept at the grand mean) and accounting for within-subjects designs when appropriate (i.e., for Study 1c and Study 4) by including maximal random effects structures (random intercepts for participants). In these analyses, I am primarily interested in whether the intercept is estimated to be differentiable from zero, which I gauge by assessing whether the 95% credible interval for the intercept contains zero.
I conduct many such regressions in this chapter: One for each of the three pairs of conceptual units (BODY - HEART, BODY - MIND, and HEART - MIND), for each age group, for each sample. A summary of these intercepts across all samples and studies can be found at the end of this chapter (Figure 4.10, panel B). In addition, for studies that include a developmental comparison (Studies 2-4), I conduct an additional analysis for each of the three pairs of conceptual units, including main effects and interactions to compare the age groups included (dummy-coded with adults as the baseline); these analyses provide formal assessments of the degree to which children differ from adults in the asymmetry of their responses to these conceptual units. I do not implement any “corrections” for multiple comparisons, in part because my evaluations of these analyses are based on credible intervals rather than p-values or other frequentist indices of statistical significance. Parameter estimates (b) can be used as indices of effect size.
Study 1: An adult endpoint
In the context of this dissertation, Study 1 serves to describe a developmental endpoint for conceptual representations of mental life. In this chapter, I focus on what this study can reveal about the relationships among the conceptual units discussed in Chapter III. These analyses were not included in the original publication of this work (Weisman et al., 2017).
Studies 1a-1c employed the “edge case” variant of the general approach, with participants assessing the mental capacities of a beetle, a robot, or both. Studies 1a and 1b were identical: US adults (Study 1a: n=405; Study 1b: n=406) each assessed a single target character on 40 mental capacities. Study 1c employed very similar methods, with the exception that participants (n=200) each assessed both target characters side by side (with left-right position counterbalanced across participants). Because these studies were so similar, in this chapter, I will discuss them in tandem.
Study 1d employed the “diverse characters” variant of the general approach, in which 431 US adults were randomly assigned to assess the same set of 40 mental capacities used in Studies 1a-1d for one of the following 21 target characters: an adult, a child, an infant, a person in a persistent vegetative state, a fetus, a chimpanzee, an elephant, a dolphin, a bear, a dog, a goat, a mouse, a frog, a blue jay, a fish, a beetle, a microbe, a robot, a computer, a car, or a stapler. (See Chapter II and Weisman et al., 2017, for detailed methods.)
Results
Studies 1a-1c
Scale construction
For each of these three studies, following the steps described in the “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each, with a large degree of overlap in items across studies; see Table 4.1.
Table 4.1: Scales for each of the conceptual units (factors) identified by EFA for US Adults in Studies 1a-1d (see Chapter III). A checkmark indicates that a mental capacity was included in a scale for a particular study.
| Capacity |
Study 1a |
Study 1b |
Study 1c |
Study 1d |
| BODY scale |
| getting hungry |
✓ |
✓ |
✓ |
✓ |
| experiencing pain |
✓ |
✓ |
✓ |
✓ |
| feeling tired |
✓ |
✓ |
✓ |
✓ |
| experiencing fear |
✓ |
✓ |
✓ |
✓ |
| experiencing pleasure |
✓ |
✓ |
✓ |
✓ |
| having free will |
✓ |
|
|
|
| being conscious |
|
✓ |
|
|
| having desires |
|
|
✓ |
|
| feeling calm |
|
|
|
✓ |
| HEART scale |
| feeling embarrassed |
✓ |
✓ |
✓ |
✓ |
| experiencing pride |
✓ |
✓ |
✓ |
✓ |
| feeling love |
✓ |
✓ |
✓ |
|
| experiencing guilt |
✓ |
✓ |
✓ |
✓ |
| holding beliefs |
✓ |
|
|
✓ |
| feeling disrespected |
✓ |
✓ |
✓ |
✓ |
| feeling depressed |
|
✓ |
✓ |
|
| telling right from wrong |
|
|
|
✓ |
| MIND scale |
| remembering things |
✓ |
✓ |
✓ |
✓ |
| recognizing someone |
✓ |
|
✓ |
|
| sensing temperatures |
✓ |
|
✓ |
✓ |
| communicating with others |
✓ |
✓ |
✓ |
✓ |
| seeing things |
✓ |
✓ |
|
✓ |
| perceiving depth |
✓ |
|
✓ |
✓ |
| detecting sounds |
|
✓ |
✓ |
✓ |
| working toward a goal |
|
✓ |
|
|
| making choices |
|
✓ |
|
|
Visualization
The visualizations of relationships among scores on these BODY, HEART, and MIND scales are remarkably similar across Studies 1a-1c (see Figure 4.1, rows A-C).
BODY vs. HEART
First I consider the relationship between BODY and HEART (Figure 4.1, leftmost column: panels A1, B1, and C1). To my eyes, the most striking features of these visualizations are that (1) there is a positive relationship between scores on the BODY and HEART scales (an observation confirmed by significantly positive Pearson correlations; Study 1a: r = 0.50; p < 0.001; 95% CI: [0.42, 0.57]; Study 1b: r = 0.48; p < 0.001; 95% CI: [0.40, 0.55]; Study 1c: Study 1c: r = 0.60; p < 0.001; 95% CI: [0.53, 0.66]); and (2) there are virtually no datapoints above the line of equivalence (\(y = x\), dotted diagonal line), and certainly no datapoints in the upper left corner of the plot of these plots. Individual participants tended to endorse the mental capacity items included in the BODY scale at least as strongly, and often more strongly, than they endorsed items included in the HEART scale—in other words, that many participants attributed more BODY than HEART to the target character in question, but virtually no participants attribute more HEART than BODY. This asymmetry appears to have been driven primarily by participants’ assessments of the beetle (in red); for the robot (in blue), BODY and HEART scores appear to have been more similar (close to the dotted line), and were generally quite low.
BODY vs. MIND
Next I consider the relationship between BODY and MIND (Figure 4.1, center column: panels A2, B2, and C2). Similar to the BODY vs. HEART comparison, two notable features of these visualizations are that (1) there is a positive relationship between scores on the BODY and MIND scales (an observation confirmed by significantly positive Pearson correlations; Study 1a: r = 0.10; p = 0.036; 95% CI: [0.01, 0.20]; Study 1b: r = 0.21; p < 0.001; 95% CI: [0.12, 0.31]; Study 1c: Study 1c: r = 0.16; p = 0.001; 95% CI: [0.07, 0.26]); and (2) there are fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it, and no datapoints in the lower right corner of the plot of these plots. Most participants tended to endorse the mental capacity items included in the MIND scale roughly as strongly, and sometimes more strongly, than they endorsed items included in the BODY scale, while relatively few participants endorsed MIND items less strongly than BODY items. However, visual inspection suggests that this asymmetry was less extreme than the asymmetry between BODY and HEART scores just described. In this case, the asymmetry between BODY and MIND appears to have been driven primarily by participants’ assessments of the robot (in blue); for the beetle (in red), BODY and MIND scores appear to have been more similar (close to the dotted line).
HEART vs. MIND
Finally I consider the relationship between HEART and MIND (Figure 4.1, rightmost column: panels A3, B3, and C3). Again, two features of these visualizations are particularly striking: (1) There is a positive relationship between scores on the MIND and HEART scales (an observation confirmed by significantly positive Pearson correlations; Study 1a: r = 0.21; p < 0.001; 95% CI: [0.12, 0.30]; Study 1b: r = 0.15; p = 0.002; 95% CI: [0.06, 0.25]; Study 1c: Study 1c: r = 0.27; p < 0.001; 95% CI: [0.18, 0.36]); and (2) there are virtually no datapoints below the line of equivalence (\(y = x\), dotted diagonal line). The asymmetry between MIND and HEART scores appears to have been particularly extreme: Almost all participants endorsed the mental capacity items included in the MIND scale more strongly than the items included in the HEART scale. In this case, this asymmetry appears to be born out for both target characters, but perhaps more exaggerated for the beetle (in red) than the robot (in blue).

Analysis of asymmetries
Here I provide a formal analysis of the asymmetries revealed by the visualizations in the previous section. For each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I conduct a Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the two “edge cases” that were featured as target characters in these studies (a beetle vs a robot), and including maximal random effects structures (in this case, no random effects for Studies 1a and 1b, and random intercepts for participants in Study 1c). See Figure 4.2, panels A-C for visual depictions of these difference scores.
BODY vs. HEART
Across Studies 1a-1c, BODY vs. HEART difference scores were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.2). As I speculated in the previous section, in all studies this difference was driven by participants’ assessments of the beetle; in the aggregate, difference scores were reduced to 0 for the robot (see the “Robot vs. GM” row for the “BODY-HEART” comparison in Table 4.2).
BODY vs. MIND
Across Studies 1a-1c, BODY vs. MIND difference scores were substantially non-zero, in the direction of participants endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.2). In all studies this difference was driven by participants’ assessments of the robot; in the aggregate, difference scores were reduced to 0 for the beetle (see the “Robot vs. GM” row for the “BODY-MIND” comparison in Table 4.2).
HEART vs. MIND
Across Studies 1a-1c, HEART vs. MIND difference scores were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.2). In all studies this difference was somewhat exaggerated in assessments of the robot, relative to the beetle (see the “Robot vs. GM” row for the “HEART-MIND” comparison in Table 4.2).

Table 4.2: Regression analyses of difference scores for US adults in Studies 1a-1c. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included two fixed effect parameters: (1) the intercept, which I treat as an index of the asymmetry in attributions of the two conceptual units in question; and (2) a difference between target characters, reported here as a difference between the robot and the grand mean (GM). Intercepts are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
|
Study 1a |
Study 1b |
Study 1c |
| Parameter |
b |
95% CI |
|
b |
95% CI |
|
b |
95% CI |
|
| BODY - HEART |
| Intercept |
0.22 |
[ 0.20, 0.24] |
* |
0.24 |
[ 0.22, 0.25] |
* |
0.24 |
[ 0.22, 0.26] |
* |
| Robot vs. GM |
-0.22 |
[-0.24, -0.20] |
* |
-0.22 |
[-0.24, -0.21] |
* |
-0.24 |
[-0.25, -0.22] |
* |
| BODY - MIND |
| Intercept |
-0.28 |
[-0.30, -0.26] |
* |
-0.27 |
[-0.29, -0.25] |
* |
-0.27 |
[-0.29, -0.25] |
* |
| Robot vs. GM |
-0.31 |
[-0.33, -0.28] |
* |
-0.28 |
[-0.30, -0.25] |
* |
-0.32 |
[-0.34, -0.29] |
* |
| HEART - MIND |
| Intercept |
-0.50 |
[-0.52, -0.47] |
* |
-0.51 |
[-0.54, -0.48] |
* |
-0.51 |
[-0.54, -0.49] |
* |
| Robot vs. GM |
-0.09 |
[-0.11, -0.06] |
* |
-0.05 |
[-0.08, -0.03] |
* |
-0.08 |
[-0.10, -0.06] |
* |
Interim discussion
Across Studies 1a-1c, visual inspection of the relationships among the conceptual units identified in Chapter III (BODY, HEART, and MIND) suggested that all of these relationships are characterized by two features: (1) Positive contingencies, such that the more strongly a participant endorsed one conceptual unit, the more strongly they tended to endorse the others; and (2) Robust asymmetries, such that participants tended to endorse MIND more strongly than BODY or HEART, and HEART more strongly than MIND. These asymmetries were most pronounced for comparisons involving HEART, with the vast majority of participants in all three of these studies endorsing both BODY and MIND more strongly than HEART for both of the “edge case” characters included in these studies (a beetle and a robot). Formal analyses of difference scores across the BODY, HEART, and MIND scales in Studies 1a-1c confirmed these observations.
Study 1d
Scale construction
Following the steps described in the “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each, with a large degree of overlap in items between these scales and the scales derived from Studies 1a-1c; see Table 4.1.
Visualization
Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.1, row D.
BODY vs. HEART
First I consider the relationship between BODY and HEART (Figure 4.1, panel D1). Much as in Studies 1a-1c (rows A-C), the most striking features of this visualization are that (1) there is a positive relationship between scores on the BODY and HEART scales (r = 0.57; p < 0.001; 95% CI: [0.50, 0.63]); and (2) there are virtually no datapoints above the line of equivalence (\(y = x\), dotted diagonal line), and certainly no datapoints in the upper left corner of the plot. Individual participants tended to endorse the mental capacity items included in the BODY scale at least as strongly, and often more strongly, than they endorsed items included in the HEART scale—in other words, many participants attributed more BODY than HEART to the target character in question, but virtually no participants attributed more HEART than BODY.
Visual inspection of mean scores by target character further reveals that, in the aggregate, characters that received relatively low BODY scores (e.g., inert objects, technologies, the fetus, the person in a persistent vegetative state, and such “lower” lifeforms as a microbe) received universally low mean HEART scores, while characters that received relatively high BODY scores (e.g., “higher” lifeforms like animals and typical humans) varied in their mean HEART scores. This raises the intriguing possibility that attributions of BODY and HEART may have been governed by some sort of “threshold” model, in which attributions of any substantial amount of HEART depend on the target character having a certain degree of BODY.
BODY vs. MIND
Next I consider the relationship between BODY and MIND (Figure 4.1, panel D2). As in Studies 1a-1c, two notable features of this visualization are that (1) there is a positive relationship between scores on the BODY and MIND scales (r = 0.75; p < 0.001; 95% CI: [0.71, 0.79]); and (2) there are datapoints in the upper left but not the lower right corner of the plots. However, while participants who assessed certain target characters (namely, the technologies) tended to endorse the mental capacity items included in the MIND scale roughly as strongly, and sometimes more strongly, than they endorsed items included in the BODY scale, participants who assessed other target characters, if anything, appear to have shown the reverse pattern, endorsing MIND items slightly less strongly than BODY items. In other words, there appears to be a less consistency in the “asymmetry” between BODY and MIND in Study 1d than there was in Studies 1a-1c.
HEART vs. MIND
Finally I consider the relationship between HEART and MIND (Figure 4.1, panel D1). Much as in Studies 1a-1c (rows A-C), the most striking features of this visualization are that (1) there is a positive relationship between scores on the HEART and MIND scales (r = 0.52; p < 0.001; 95% CI: [0.45, 0.59]); and (2) there are virtually no datapoints below the line of equivalence (\(y = x\), dotted diagonal line), and certainly no datapoints in the lower right corner of the plot. Individual participants tended to endorse the mental capacity items included in the MIND scale at least as strongly, and often more strongly, than they endorsed items included in the HEART scale—in other words, many participants attributed more MIND than HEART to the target character in question, but virtually no participants attributed more HEART than MIND.
Visual inspection of mean scores by target character further reveals that, in the aggregate, characters that received relatively low MIND scores (e.g., inert objects, the fetus, and such “lower” lifeforms as a microbe) received universally low mean HEART scores, while characters that received relatively high MIND scores (e.g., more sophisticated technologies as well as “higher” lifeforms like animals and typical humans) varied in their mean HEART scores. As in the BODY vs. HEART comparison discussed earlier, this raises the intriguing possibility that attributions of HEART and MIND may have been governed by some sort of “threshold” model, in which attributions of any substantial amount of HEART depend on the target character having a certain degree of MIND.
Analysis of asymmetries
Here I provide a formal analysis of the asymmetries revealed by the visualizations in the previous section. As in Studies 1a-1c, for each pair of conceptual units, I conduct a Bayesian regression to compare difference scores to zero, controlling for differences in assessments of the 21 “diverse characters” that were featured as target characters in these studies. See Figure 4.2, panel D, for visual depictions of these difference scores.
BODY vs. HEART
These regression analyses confirmed that in Study 1d, as in Studies 1a-1c, BODY vs. HEART difference scores were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.3).
This asymmetry was more pronounced for some characters, and less pronounced for others—namely, humans (who generally received high scores on both the BODY and HEART scales) and technologies (who generally received low scores on both the BODY and HEART scales). A full discussion of the differences between target characters is beyond the scope of this chapter, but it is worth noting that there were no characters for whom this asymmetry was systematically reversed (i.e., who were generally considered to have more HEART than BODY capacities). See Figure 4.2, panel D, and the various comparisons of target characters to the grand mean for the “BODY-HEART” comparison in Table 4.3.
BODY vs. MIND
These regression analyses indicated that in Study 1d, in contrast to Studies 1a-1c, BODY vs. MIND difference scores were only very slightly non-zero, in the direction of participants endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.3).
Again, this asymmetry was more pronounced for some characters—namely, technologies (who generally received high scores on the MIND scale and low scores on the BDOY scale)—and less pronounced for others. Indeed, there were some characters (e.g., the child, the infant, the fetus, and a handful of non-human animals) for whom this asymmetry tended to run in the opposite direction, with participants attributing more BODY than MIND capacities. See Figure 4.2, panel D, and the various comparisons of target characters to the grand mean for the “BODY-MIND” comparison in Table 4.3.
HEART vs. MIND
These regression analyses confirmed that in Study 1d, as in Studies 1a-1c, HEART vs. MIND difference scores were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.3).
Similar to the BODY vs. HEART comparison, this asymmetry was less pronounced for humans (who generally received high scores on both the HEART and MIND scales), and more pronounced for other characters. A full discussion of the differences between target characters is beyond the scope of this chapter, but it is worth noting that there were no characters for whom this asymmetry was systematically reversed (i.e., who were generally considered to have more HEART than MIND capacities). See Figure 4.2, panel D, and the various comparisons of target characters to the grand mean for the “HEART-MIND” comparison in Table 4.3.
Interim discussion
In Study 1d, many of the results obtained in Studies 1a-1c were upheld. In particular, (1) The relationships between BODY vs. HEART and between MIND vs. HEART appear to be positive, such that the more strongly a participant endorsed one conceptual unit, the more strongly they tended to endorse the other; and (2) There appear to be robust asymmetries in these positive relationships, such that participants tended to endorse both BODY or MIND more strongly than HEART.
Visual inspection of the BODY vs. MIND scatterplot for Study 1d suggests that this relationship was quite variable across participants and across target characters—even more variable and less robust than what was observed in Studies 1a-1c.
Formal analyses of difference scores across the BODY, HEART, and MIND scales in Study 1d confirmed these informal observations: Participants tended to endorse both BODY and MIND more strongly than HEART. In the aggregate, there was a slight tendency for participants to endorse MIND more strongly than BODY, but this asymmetry was weak and highly contingent on the particular target character that participants were assigned to assess.
Table 4.3: Regression analyses of difference scores for US adults in Study 1d. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included two fixed effect parameters: (1) the intercept, which I treat as an index of the asymmetry in attributions of the two conceptual units in question; and (2) a difference between target characters, reported here as a difference between each character and the grand mean (GM). Intercepts are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
|
Study 1d |
| Parameter |
b |
95% CI |
|
| BODY - HEART |
| Intercept |
0.35 |
[ 0.33, 0.37] |
* |
| Adult vs. GM |
-0.33 |
[-0.42, -0.24] |
* |
| Child vs. GM |
-0.12 |
[-0.21, -0.04] |
* |
| Infant vs. GM |
0.37 |
[ 0.28, 0.46] |
* |
| PVS vs. GM |
-0.25 |
[-0.34, -0.17] |
* |
| Fetus vs. GM |
-0.04 |
[-0.13, 0.04] |
|
| Chimpanzee vs. GM |
0.10 |
[ 0.02, 0.19] |
* |
| Elephant vs. GM |
0.11 |
[ 0.03, 0.20] |
* |
| Dolphin vs. GM |
0.14 |
[ 0.05, 0.22] |
* |
| Bear vs. GM |
0.22 |
[ 0.13, 0.31] |
* |
| Dog vs. GM |
0.07 |
[-0.01, 0.15] |
|
| Goat vs. GM |
0.23 |
[ 0.15, 0.32] |
* |
| Mouse vs. GM |
0.28 |
[ 0.19, 0.38] |
* |
| Frog vs. GM |
0.31 |
[ 0.22, 0.39] |
* |
| Blue jay vs. GM |
0.30 |
[ 0.21, 0.39] |
* |
| Fish vs. GM |
0.20 |
[ 0.11, 0.29] |
* |
| Beetle vs. GM |
0.05 |
[-0.04, 0.14] |
|
| Microbe vs. GM |
-0.21 |
[-0.30, -0.12] |
* |
| Robot vs. GM |
-0.39 |
[-0.47, -0.30] |
* |
| Computer vs. GM |
-0.36 |
[-0.44, -0.27] |
* |
| Car vs. GM |
-0.35 |
[-0.43, -0.26] |
* |
| BODY - MIND |
| Intercept |
-0.02 |
[-0.04, -0.01] |
* |
| Adult vs. GM |
0.05 |
[-0.02, 0.11] |
|
| Child vs. GM |
0.13 |
[ 0.06, 0.20] |
* |
| Infant vs. GM |
0.26 |
[ 0.19, 0.33] |
* |
| PVS vs. GM |
0.05 |
[-0.02, 0.12] |
|
| Fetus vs. GM |
0.11 |
[ 0.04, 0.18] |
* |
| Chimpanzee vs. GM |
0.11 |
[ 0.04, 0.18] |
* |
| Elephant vs. GM |
0.03 |
[-0.03, 0.10] |
|
| Dolphin vs. GM |
0.03 |
[-0.04, 0.10] |
|
| Bear vs. GM |
0.07 |
[ 0.00, 0.14] |
* |
| Dog vs. GM |
0.12 |
[ 0.06, 0.18] |
* |
| Goat vs. GM |
0.12 |
[ 0.05, 0.19] |
* |
| Mouse vs. GM |
0.07 |
[-0.01, 0.14] |
|
| Frog vs. GM |
0.07 |
[ 0.00, 0.13] |
|
| Blue jay vs. GM |
0.04 |
[-0.03, 0.10] |
|
| Fish vs. GM |
0.03 |
[-0.04, 0.10] |
|
| Beetle vs. GM |
0.00 |
[-0.07, 0.07] |
|
| Microbe vs. GM |
-0.08 |
[-0.15, -0.01] |
* |
| Robot vs. GM |
-0.65 |
[-0.72, -0.58] |
* |
| Computer vs. GM |
-0.40 |
[-0.47, -0.34] |
* |
| Car vs. GM |
-0.18 |
[-0.24, -0.12] |
* |
| HEART - MIND |
| Intercept |
-0.38 |
[-0.40, -0.35] |
* |
| Adult vs. GM |
0.38 |
[ 0.28, 0.47] |
* |
| Child vs. GM |
0.25 |
[ 0.15, 0.35] |
* |
| Infant vs. GM |
-0.12 |
[-0.21, -0.02] |
* |
| PVS vs. GM |
0.30 |
[ 0.21, 0.39] |
* |
| Fetus vs. GM |
0.15 |
[ 0.06, 0.26] |
* |
| Chimpanzee vs. GM |
0.01 |
[-0.09, 0.10] |
|
| Elephant vs. GM |
-0.08 |
[-0.17, 0.02] |
|
| Dolphin vs. GM |
-0.11 |
[-0.20, -0.02] |
* |
| Bear vs. GM |
-0.15 |
[-0.24, -0.05] |
* |
| Dog vs. GM |
0.05 |
[-0.04, 0.13] |
|
| Goat vs. GM |
-0.11 |
[-0.20, -0.02] |
* |
| Mouse vs. GM |
-0.21 |
[-0.32, -0.11] |
* |
| Frog vs. GM |
-0.24 |
[-0.34, -0.14] |
* |
| Blue jay vs. GM |
-0.27 |
[-0.36, -0.18] |
* |
| Fish vs. GM |
-0.17 |
[-0.27, -0.08] |
* |
| Beetle vs. GM |
-0.05 |
[-0.14, 0.05] |
|
| Microbe vs. GM |
0.13 |
[ 0.03, 0.22] |
* |
| Robot vs. GM |
-0.27 |
[-0.36, -0.18] |
* |
| Computer vs. GM |
-0.05 |
[-0.14, 0.05] |
|
| Car vs. GM |
0.17 |
[ 0.08, 0.26] |
* |
Discussion
Studies 1a-1d converge to suggest that, among US adults, the relationships among BODY, HEART, and MIND, are characterized by being (1) positive, such that the more strongly a participant endorsed one conceptual unit, the more strongly they tended to endorse the other; and (2) asymmetrical, such that certain conceptual units are systematically endorsed more strongly than others. In particular, the vast majority of participants across all four of these studies endorsed both BODY and MIND at least as strongly, and often more strongly, than they endorsed HEART, regardless of which target character they were assessing or how strong their endorsements were in absolute terms. Taken together, I consider this to be fairly strong evidence that the conceptual units that I have called BODY and MIND are more basic or fundamental than the unit that I refer to as HEART.
The relationship between these two more “basic” conceptual units appears to be more complicated. Across Studies 1a-1d, in the aggregate participants tended to endorse MIND (slightly) more strongly than BODY. However, in each study this asymmetry was driven by assessments of a particular kind of target character: technologies (the robot in Studies 1a-1c; the robot, computer, and car in Study 1d). For other target characters (including the beetle in Studies 1a-1c, as well as many of the target characters in Study 1d), average difference scores hovered around zero, with some participants endorsing BODY more strongly than MIND, others endorsing MIND more strongly than BODY, and still others endorsing BODY and MIND to roughly equal degrees. In Study 1d there were even a few target characters—namely, immature humans and a handful of non-human animals—for whom difference scores systematically ran in the opposite direction to what was observed among technologies, with participants endorsing BODY more strongly than MIND. Taken together, these observations suggest that asymmetries in attributions of BODY vs. MIND are more variable across individual participants and more sensitive to differences in target characters—and, by extension, that there is no general or robust hierarchical relationship between these two conceptual units in US adults’ conceptual representations of mental life.
Study 2: Conceptual change between middle childhood (7-9y) and adulthood
In the context of this dissertation, Study 2 serves to provide an initial investigation of representations of mental life earlier in development, in what I have called middle childhood (7-9y). In this chapter, I focus on what this study can reveal about changes in the relationships among the conceptual units BODY, HEART, and MIND between middle childhood and adulthood.
In Study 2, 200 US adults and 200 US children between the ages of 7.01-9.99 years (median: 8.31y) each assessed a single target character on 40 mental capacities. This study employed the “edge case” variant of the general approach, with participants randomly assigned to assess either a beetle or a robot. (See Chapter II for detailed methods.)
Results
Adults
Scale construction
Following the steps described in the “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.10.
Visualization and analysis of asymmetries
Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.3, row A. Here I combine my informal descriptions of these visualizations with formal analyses of difference scores between conceptual units, controlling for differences in assessments of the two “edge cases” that were featured as target characters in these studies. See Figure 4.5, panel A, for visual depictions of these difference scores, and Table 4.4 for the full results of these Bayesian regression analyses.
BODY vs. HEART
As in Study 1, among adults in Study 2 there was a was a positive relationship between scores on the BODY and HEART scales (r = 0.47; p < 0.001; 95% CI: [0.35, 0.57]). The visualization of this relationship (Figure 4.3, panel A1) featured very few datapoints above the line of equivalence (\(y = x\), dotted diagonal line)—an asymmetry which appeared to have been driven primarily by assessments of the beetle (in red). A regression analysis confirmed that adults’ BODY vs. HEART difference scores were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.4), and this asymmetry was driven primarily by participants’ assessments of the beetle (see the “Robot vs. GM” row for the “BODY-HEART” comparison in Table 4.4).
BODY vs. MIND
Unlike Study 1, among adults in Study 2 the relationship between scores on the BODY and MIND scales was not significantly positive (r = 0.06; p = 0.422; 95% CI: [-0.08, 0.19]). As in Study 1, the visualization of this relationship (Figure 4.3, panel A2) featured fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it, and no datapoints in the lower right corner of the plot—an asymmetry which appeared to have been driven primarily by assessments of the robot (in blue) and which generally appeared to be less extreme than the other two comparisons. A regression analysis confirmed that adults’ BODY vs. MIND difference scores were substantially non-zero, in the direction of participants endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.4), and this asymmetry was driven primarily by participants’ assessments of the robot (see the “Robot vs. GM” row for the “BODY-MIND” comparison in Table 4.4).
HEART vs. MIND
As in Study 1, among adults in Study 2 there was a positive relationship between scores on the HEART and MIND scales (r = 0.19; p = 0.006; 95% CI: [0.06, 0.32]). As in Study 1, the visualization of this relationship (Figure 4.3, panel A3) featured virtually no datapoints below the line of equivalence (\(y = x\), dotted diagonal line)—an asymmetry which appeared to have been especially extreme. A regression analysis confirmed that adults’ HEART vs. MIND difference scores were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.4); this asymmetry was somewhat exaggerated in assessments of the robot (see the “Robot vs. GM” row for the “HEART-MIND” comparison in Table 4.4).
Interim discussion
The relationships among adults’ endorsements of the conceptual units in Study 2 appear to be very similar to those revealed by Study 1: (1) With the exception of BODY vs. MIND, these inter-unit relationships were positive, such that the more strongly a participant endorsed one conceptual unit, the more strongly they tended to endorse the others; and (2) There were robust asymmetries in these positive relationships, such that participants tended to endorse MIND more strongly than BODY or HEART, and HEART more strongly than MIND. These asymmetries were particularly pronounced for comparisons involving HEART, with virtually every participant across all three of these studies endorsing both BODY and MIND more strongly than HEART for both of the “edge case” characters included in these studies (a beetle and a robot). Formal analyses of difference scores across the BODY, HEART, and MIND scales among adults in Study 2 confirm these informal observations.
The similarity in results among adults in Studies 1 and 2 offers further evidence that this conceptual organization is robust to differences in experimental methods, including differences in the set of mental capacities and in the response scales employed in these studies.
Children (7-9y)
The primary goal of Study 2 was to begin investigating the development of these conceptual representations: What are the relationships among BODY, HEART, and MIND among children ages 7-9y, and how do these relationships compare to those among adults, as described in the previous section?
I begin my exploration of this aspect of conceptual change by applying the same BODY, HEART, and MIND scales (derived from EFA of adults’ responses) to children’s responses, examining the same visualizations, and conducting the same regression analyses. I then conduct a formal comparison of children’s and adults’ results (“Developmental comparison”), before briefly considering what the relationships between BODY, HEART, and MIND might look like if they were indexed by scales derived from EFA of children’s, rather than adults’ responses (“Children (7-9y), using children’s own scales”).
Visualization and analysis of asymmetries
Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.3, row B. Here I combine my informal descriptions of these visualizations with formal analyses of difference scores between conceptual units, controlling for differences in assessments of the two “edge cases” that were featured as target characters in these studies. See Figure 4.5, panel B, for visual depictions of these difference scores, and Table 4.4 for the full results of these Bayesian regression analyses.
BODY vs. HEART
As among adults in this study (Figure 4.3, panel A1), the relationship between children’s scores on the BODY and HEART scales (panel B1) was positive (r = 0.36; p < 0.001; 95% CI: [0.23, 0.48]), and there appear to be somewhat fewer datapoints above the line of equivalence (\(y = x\), dotted diagonal line) than below it. However, this asymmetry is less striking among children than it was among adults: While many children attributed more BODY than HEART to the target character in question (like the vast majority of adults), quite a few children attributed more HEART than BODY. Indeed, a regression analysis revealed that children’s BODY vs. HEART difference scores were not quite differentiable from zero (the lower bound of the 95% credible interval was effectively zero; see the “Intercept” row for the “BODY-HEART” comparison in Table 4.4). Moreover, the direction of difference varied substantially across target characters (see the “Robot vs. GM” row for the “BODY-HEART” comparison in Table 4.4), with children tending to attribute more BODY than HEART to the beetle but, if anything, more HEART than BODY to the robot.
BODY vs. MIND
As among adults in this study (Figure 4.3, panel A2), there was no significant relationship between children’s scores on the BODY and MIND scales (panel B3; r = 0.02; p = 0.826; 95% CI: [-0.12, 0.15]). In the visualization of children’s scores there appear to be somewhat fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it, but this asymmetry is less striking among children than it was among adults: While many children attributed more MIND than BODY to the target character in question (like the vast majority of adults), quite a few children attributed more BODY than MIND. A regression analysis confirmed that, on the whole, children’s BODY vs. MIND difference scores were substantially non-zero, in the direction of children endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.4), but this difference varied substantially across target characters (see the “Robot vs. GM” row for the “BODY-MIND” comparison in Table 4.4), with children tending to attribute more MIND than BODY to the robot but, if anything, more BODY than MIND to the beetle.
HEART vs. MIND
As among adults in this study (Figure 4.3, panel A3), the relationship between children’s scores on the HEART and MIND scales (panel B3) was positive (r = 0.16; p = 0.021; 95% CI: [0.03, 0.30]), and there appear to be somewhat fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it. However, as in the BODY vs. HEART and BODY vs. MIND comparisons just discussed, this asymmetry is less striking among children than it was among adults: While many children attributed more MIND than HEART to the target character in question (like the vast majority of adults), quite a few children attributed more HEART than MIND. A regression analysis confirmed that, on the whole, children’s HEART vs. MIND difference scores were substantially non-zero, in the direction of children endorsing MIND items more strongly than __BODY_HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.4); this difference was present for both target characters, but exaggerated in assessments of the robot (see the “Robot vs. GM” row for the “BODY-MIND” comparison in Table 4.4).

Developmental comparison
The preceding visualizations and analyses all suggested that children’s responses were generally less asymmetrical than those of adults. This is perhaps easiest to observe in Figure 4.3, row D, which presents (hypothetical) “movement” between the mean placement for a target character among children (beginning of arrow) and the mean placement for a target character among adults (arrowhead), for each pair of conceptual units. In each case, this “movement” either maintains a similar distance from the line of equivalence (\(y = x\)) (as with mean assessments of the robot in the BODY vs. HEART space, panel C1; and the beetle in the BODY vs. MIND space, panel C2) or moves away from the line of equivalence toward the upper left and lower right corners of the plot (as with mean assessments of the beetle in the BODY vs. HEART space, panel C1; the robot in the BODY vs. MIND space, panel C2; and both characters in the HEART vs. MIND space, panel C3). Analysis of changes in absolute attributions of BODY, HEART, and MIND, is pursued in Chapter V; for the purposes of the current chapter, the primary observation of interest is that these “shifts” between child and adult assessments of these characters generally point in the direction of stable or increasing (not decreasing) asymmetries over developmental time.
To assess the size and robustness of these apparent developmental differences, I conducted formal comparisons of difference scores between conceptual units among these two age groups. For each pair of conceptual units, I pooled data from both age groups and modified my regression analyses to include a main effect of age group (comparing children’s difference scores to the baseline set by adults) and an interaction between age group and target character (assessing whether the observed differences between characters varied by age group).
These analyses confirmed that difference scores for all three pairs of conceptual units were substantially closer to zero among children, as compared to adults (see the “Children vs. adults” rows for each comparison in Table 4.5). The difference between target characters was attenuated among children in the BODY vs. MIND comparison, but not in other comparisons (see the “Robot vs. GM” rows in Table 4.5).
Interim discussion
Both visual inspection and formal analyses of the relationships among BODY, HEART, and MIND suggest that the the asymmetries in relationships among 7- to 9-year-old children’s endorsements of these conceptual units were similar in direction—but substantially attenuated in size—relative to the baseline set by adults. This suggests that the proposed hierarchical relationships between these conceptual units are nascent in this age group, but may not be fully robust or “mature.”
Children (7-9y), using children’s own scales
The previous analyses made use of BODY, HEART, and MIND scores dervied from EFAs of adults’ mental capacity representations to examine the relationships among these conceptual units among both adults and children. But Chapter III suggested that, while 7- to 9-year-old children’s conceptual units were very similar to those of adults, they were not exactly identical. What would would the relationships among BODY, HEART, and MIND look like if they were assessed using scales derived from chidlren’s own responses, rather than adults’? Here I briefly consider this possibility for children in Study 2; for parallel analyses for children in Studies 3 and 4, see [XX APPENDIX B?].
Scale construction
Following the steps described in the “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each. Notably, children’s BODY and HEART scales were very similar to the BODY and HEART scales derived from adults in this study, differing by only one item each. The MIND scales for children vs. adults had three items in common, and differed by three items; see Table 4.10.
Visualization and analysis of asymmetries

Visualizations of relationships among scores on these child-based BODY, HEART, and MIND scales are provided in Figure 4.4, and difference scores between pairs of conceptual units are depicted in Figure 4.5, panel C. As these plots illustrate, the pattern of results using these child-based scales was virtually identical to the pattern of results using the adult-based scales as discussed in the previous section; see Table 4.5 for a juxtaposition of the regression analyses. This suggests that this attenuation of asymmetries across pairs of conceptual units was not merely due to the operationalization of BODY, HEART, and MIND using adults’ rather than children’s EFA solutions; these developmental differences were observed regardless of whether these conceptual units were indexed by scales designed to capture adults’ or children’s construals of BODY, HEART, and MIND.

Discussion
Study 2 provides further confirmation of the robustness of the asymmetric relationships among conceptual units in adults’ representations of mental life as revealed by Study 1. Using a modified experimental paradigm, a slightly different set of mental capacities, and a three-point (rather than seven-point) response scale revealed the same pattern of asymmetries in adults’ endorsements of BODY, HEART, and MIND: Regardless of which of the two “edge cases” they assessed, adults systematically endorsed both BODY and MIND at least as strongly, and often more strongly, than HEART, while the relationship between BODY and MIND was more contingent on the target character under evaluation.
Study 2 also affords the first glimpse into the development of this aspect of conceptual representations of mental life among 7- to 9-year-old children. A variety of visualizations and analyses converge to suggest that, on the whole, the directions of these relationships among conceptual units are in place by this point in development, but these asymmetries are not nearly as pronounced or robust among children as they appear to be among adults.
There are some hints from Study 2 that the asymmetry between BODY vs. HEART may be a point of particular immaturity for 7- to 9-year-old children: While very few adults in this study (or in any previous study) endorsed HEART capacities more strongly than BODY capacities for any target character, quite a lot of children did—particularly if they happened to assess the robot. Indeed, on the whole, children in this study showed no systematic asymmetry between these two conceptual units.
Table 4.4: Regression analyses of difference scores among US adults and children (7-9y of age) in Study 2. For children, this includes an analysis using adults' BODY, HEART, and MIND scales (middle columns), as well as an analysis using scales derived from EFA of children's own mental capacity attributions (rightmost columns). The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included two fixed effect parameters: (1) the intercept, which I treat as an index of the asymmetry in attributions of the two conceptual units in question; and (2) a difference between target characters, reported here as a difference between the robot and the grand mean (GM). The intercepts are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
|
Adults |
Children, 7-9y (using adults' scales) |
Children, 7-9y (using their own scales) |
| Parameter |
b |
95% CI |
|
b |
95% CI |
|
b |
95% CI |
|
| BODY - HEART |
| Intercept |
0.29 |
[ 0.26, 0.33] |
* |
0.04 |
[ 0.00, 0.09] |
|
-0.03 |
[-0.08, 0.01] |
|
| Robot vs. GM |
-0.25 |
[-0.28, -0.22] |
* |
-0.20 |
[-0.24, -0.16] |
* |
-0.21 |
[-0.25, -0.16] |
* |
| BODY - MIND |
| Intercept |
-0.34 |
[-0.38, -0.31] |
* |
-0.16 |
[-0.20, -0.13] |
* |
-0.17 |
[-0.21, -0.13] |
* |
| Robot vs. GM |
-0.37 |
[-0.41, -0.34] |
* |
-0.29 |
[-0.32, -0.25] |
* |
-0.30 |
[-0.34, -0.26] |
* |
| HEART - MIND |
| Intercept |
-0.64 |
[-0.68, -0.60] |
* |
-0.21 |
[-0.26, -0.16] |
* |
-0.14 |
[-0.19, -0.08] |
* |
| Robot vs. GM |
-0.13 |
[-0.16, -0.09] |
* |
-0.08 |
[-0.13, -0.03] |
* |
-0.09 |
[-0.15, -0.04] |
* |
Table 4.5: Regression analyses of differences in difference scores between US adults and children (7-9y of age) in Study 2. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included four fixed effect parameters: (1) the intercept among adults, which I treat as an index of the asymmetry in attributions of the two conceptual units in question among adults; (2) the overall difference between children and adults (collapsing across target characters); (3) a difference between target characters among adults, reported here as a difference between the robot and the grand mean (GM); and (4) the interaction between this difference between target characters and the difference between age groups. The developmental comparisons are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
|
Developmental comparison |
| Parameter |
b |
95% CI |
|
| BODY - HEART |
| Intercept |
0.29 |
[ 0.26, 0.33] |
* |
| Children vs. adults |
-0.25 |
[-0.30, -0.20] |
* |
| Robot vs. GM |
-0.25 |
[-0.29, -0.21] |
* |
| Interaction |
0.05 |
[-0.01, 0.10] |
|
| BODY - MIND |
| Intercept |
-0.34 |
[-0.37, -0.31] |
* |
| Children vs. adults |
0.18 |
[ 0.13, 0.23] |
* |
| Robot vs. GM |
-0.37 |
[-0.41, -0.34] |
* |
| Interaction |
0.09 |
[ 0.04, 0.13] |
* |
| HEART - MIND |
| Intercept |
-0.64 |
[-0.68, -0.59] |
* |
| Children vs. adults |
0.43 |
[ 0.37, 0.49] |
* |
| Robot vs. GM |
-0.13 |
[-0.17, -0.08] |
* |
| Interaction |
0.04 |
[-0.02, 0.10] |
|
Study 3: Conceptual change over early and middle childhood (4-9y)
Study 3 builds on the investigation of middle childhood (7-9y) initiated in Study 2 and extends this exploration of conceptual change into earlier childhood (4-6y). In this chapter, I again focus on what this study can reveal about changes in the relationships among the conceptual units BODY, HEART, and MIND over the course of early and middle childhood (7-9y).
As a reminder, in the main text of this chapter I analyze children’s responses with respect to the “mature” conceptual units BODY, HEART, and MIND, as defined by EFA of adults’ responses. (See [XX APPENDIX B?] for further analyses with respect to the conceptual units identified through EFA of children’s own mental capacity attributions, as presented in Chapter III.)
In Study 3, 116 US adults, 125 “older” children (7.08-9.98 years; median: 8.56y), and 124 “younger” children (4.00-6.98 years; median: 5.03y) each assessed a single target character on 20 mental capacities. This study employed the “diverse characters” variant of the general approach, with participants randomly or pseudo-randomly assigned to assess one of the following 9 characters: an elephant, a goat, a mouse, a bird, a beetle, a teddy bear, a doll, a robot, or a computer. (See Chapter II for detailed methods.)
Results
Adults
Scale construction
Following the steps described in the “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.10.
Visualization and analysis of asymmetries
Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.6, row A. Here I combine my informal descriptions of these visualizations with formal analyses of difference scores between conceptual units, controlling for differences in assessments of the nine “diverse characters” that were featured as target characters in these studies. See Figure 4.7, panel A, for visual depictions of these difference scores, and Table 4.6 for the full results of these Bayesian regression analyses.
BODY vs. HEART
As among adults in Studies 1 and 2, two striking features of the relationship between BODY and HEART among adults in Study 3 (Figure 4.6, panel A1) are that scores on these scales were positively correlated (r = 0.65; p < 0.001; 95% CI: [0.53, 0.75]), and virtually no adults attributed more HEART than BODY to the target character they were assigned to assess. A regression analysis confirmed that BODY vs. HEART difference scores were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see Figure 4.7, panel A, and the “Intercept” row for the “BODY-HEART” comparison in Table 4.6).
These regression results also suggest that the asymmetry between BODY and HEART was primarily driven by responses to the animate beings (see the various comparisons of target characters to the grand mean for the “BODY-HEART” comparison in Table 4.6.). Indeed, visual inspection of mean scores by target character (Figure 4.6, panel A1) reveals a suite of characters—namely, inanimate objects—that, in the aggregate, received very low BODY scores and very low HEART scores. This suite of characters appears to be distinct from the other characters—all animate beings—all of which, in the aggregate, received relatively high BODY scores, but varied in their mean HEART scores. Echoing Study 1d, this raises the intriguing possibility that adults’ attributions of BODY and HEART may have been governed by some sort of “threshold” model, in which attributions of any substantial amount of HEART depend on the target character having a certain degree of BODY. It is also worth noting that, even among this wider range of target characters, there were no characters for whom the BODY-HEART asymmetry was systematically reversed (i.e., who were generally considered to have more HEART than BODY capacities).
BODY vs. MIND
As among adults in Studies 1 and 2, two striking features of the relationship between BODY and MIND among adults in Study 3 (Figure 4.6, panel A2) are that scores on these scales were positively correlated (r = 0.73; p < 0.001; 95% CI: [0.63, 0.80]), and very few adults endorsed BODY much more strongly than MIND for the target character they were assigned to assess (i.e., there were no datapoints in the lower right corner of the plot). A regression analysis confirmed that BODY vs. MIND difference scores were substantially non-zero, in the direction of participants endorsing MIND items more strongly than BODY items (see Figure 4.7, panel A, and the “Intercept” row for the “BODY-MIND” comparison in Table 4.6).
Echoing Study 1d, however, the asymmetry between BODY vs. MIND was overwhelmingly driven by responses to the two technologies (particularly the robot). Adults who assessed one of the technologies (a robot or a computer) tended to endorse the mental capacity items included in the MIND scale roughly as strongly, and often more strongly, than they endorsed items included in the BODY scale—but adults who assessed other target characters, if anything, appear to have shown the reverse pattern, endorsing MIND items slightly less strongly than BODY items. (See Figure 4.7, panel B, and the various comparisons of target characters to the grand mean for the “BODY-MIND” comparison in Table 4.6.)
HEART vs. MIND
As among adults in Studies 1 and 2, two striking features of the relationship between HEART and MIND among adults in Study 3 (Figure 4.6, panel A3) are that scores on these scales were positively correlated (r = 0.53; p < 0.001; 95% CI: [0.38, 0.65]), and virtually no adults attributed more HEART than MIND to the target character they were assigned to assess. A regression analysis confirmed that HEART vs. MIND difference scores were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see Figure 4.7, panel A, and the “Intercept” row for the “HEART-MIND” comparison in Table 4.6).
Much like the BODY-HEART comparison, these regression results also suggest that the asymmetry between HEART and MIND was more pronounced for some characters than others, and particularly weak for the two inert objects (the teddy bear and the doll; see Figure 7, panel C, and the various comparisons of target characters to the grand mean for the “HEART-MIND” comparison in Table 4.6.). Indeed, visual inspection of mean scores by target character (Figure 4.6, panel A3) suggests that, in the aggregate, characters that received low MIND scores also received low mean HEART scores, while characters that received relatively high MIND scores (e.g., the robot and all of the animate beings) varied in their mean HEART scores. Again, this echoes the intriguing possibility, raised by Study 1d, that attributions of HEART and MIND may have been governed by some sort of “threshold” model, in which attributions of any substantial amount of HEART depend on the target character having a certain degree of MIND.
Interim discussion
Among adults in Study 3, both informal observations and formal analyses revealed very similar results to Studies 1 and 2—namely, positive relationships between conceptual units that were further characterized by systematic asymmetries, with participants endorsing BODY and MIND at least as strongly, and often more strongly, than HEART. As in Study 1d—the only other study that employed the “diverse characters” approach employed in Study 3—the asymmetry between BODY vs. MIND appeared to be somewhat weaker and more variable across participants and target characters.
Children (7-9y)
Among children in Study 2, the asymmetrical relationships among BODY, HEART, and MIND appeared to be similar in direction but weaker in strength to those of adults—with the possible exception of the BODY vs. HEART comparison, for which children’s responses revealed no systematic asymmetry. Study 3 provides an opportunity to reassess these relationships in a new sample of 7- to 9-year-old children (using a slightly different experimental paradigm).
Visualization and analysis of asymmetries
Visualizations of relationships among 7- to 9-year-old children’s scores on the BODY, HEART, and MIND scales are provided in Figure 4.6, row B. Here I combine my informal descriptions of these visualizations with formal analyses of difference scores between conceptual units, controlling for differences in assessments of the nine “diverse characters” that were featured as target characters in these studies. See Figure 4.7, panel B, for visual depictions of these difference scores, and Table 4.6 for the full results of these Bayesian regression analyses.
BODY vs. HEART
As among adults in this study, the relationship between 7- to 9-year-old children’s scores on the BODY and HEART scales (Figure 4.6, panel B1) was positive (r = 0.58; p < 0.001; 95% CI: [0.45, 0.68]), and there were somewhat fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it. In contrast to Study 2, this asymmetry was strong enough in this sample of 7- to 9-year-old children to be distinguishable from zero (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.6), although the asymmetry still appears to have been weaker that the corresponding asymmetry in adults.
This analysis further revealed that, as among adults, this asymmetry between BODY vs. HEART scores was driven by children’s assessments of the animate beings (see the various comparisons of target characters to the grand mean for the “BODY-HEART” comparison in Table 4.6.). Indeed, for one target character of particular interest—the robot—the asymmetry ran in the opposite direction: In the aggregate, children appear to have attributed more HEART than BODY to this unusual social partner. This aligns with this age group’s responses to the robot in Study 2—and stands in contrast to adults, among whom there were no characters who elicited an asymmetry in this direction.
Echoing the visualizations of adults’ responses in this study, there do appear to be two suites of characters in this visualization of 7- to 9-year-old children’s responses (Figure 4.6, panel B1): inanimate objects (characterized by generally low BODY scores) and animate beings (characterized by generally high BODY scores). However, while among adults only animate beings varied in their mean HEART scores, among children there appears to be substantial variability in HEART scores in both of these groups of characters. In other words, this visualization does not provide evidence of the kind of “threshold” model that might govern adults’ responses.
BODY vs. MIND
Among 7- to 9-year-old children, as among adults in this study, the relationship between scores on the BODY and MIND scales was positive (r = 0.41; p < 0.001; 95% CI: [0.26, 0.55]). In contrast to adults, however, children showed no evidence of asymmetry in their BODY vs. MIND scores: Their difference scores were not substantially different from zero (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.6), and it is clear from the visualization that some children attributed more MIND than BODY to the target character in question (particularly if they were evaluating one of the two technologies), but others attributed more BODY than MIND (particularly if they were evaluating one of animate beings). Such between-character differences appear to be even more pronounced among children than they were among adults (see Figure 4.7, panel B2, and the various comparisons of target characters to the grand mean for the “BODY-MIND” comparison in Table 4.6.)
HEART vs. MIND
As among adults in this study, the relationship between 7- to 9-year-old children’s scores on the HEART and MIND scales was positive (r = 0.30; p = 0.001; 95% CI: [0.13, 0.45]), and children’s difference scores were substantially non-zero, in the direction of stronger endorsements for MIND items compared to HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.6). Again, however, this asymmetry was much less striking among children than it was among adults: While many children attributed more MIND than HEART to the target character in question (like the vast majority of adults), quite a few children attributed more HEART than MIND (see Figure 4.6, panel B3).
This asymmetry appeared to be present across the range of target characters included in this study, though it was more pronounced for some characters (e.g., the technologies; see Figure 4.7, panel B3, and the various comparisons of target characters to the grand mean for the “BODY-MIND” comparison in Table 4.6.)
Visual inspection of mean scores by target character reveals no evidence of the kind of “threshold” model discussed for adults.
Interim discussion
As in Study 2, the relationships among BODY, HEART, and MIND among 7- to 9-year-old children were broadly similar to those of adults, but attenuated in strength. These children tended to endorse both BODY and MIND at least somewhat more strongly than HEART, but there was no systematic asymmetry between MIND and BODY. Instead, children’s relative endorsements of BODY and MIND were highly contingent on the type of target character under consideration.
In Study 3, the asymmetry in 7- to 9-year-old children’s BODY vs. HEART scores was strong enough to be differentiable from zero (in contrast to this age group in Study 2). Interestingly, however, children in this study diverged from this general response pattern in their assessments of the robot, endorsing HEART items more strongly than BODY items for this unusual “social” partner. Together with the results of Study 2, this suggests that 7- to 9-year-old children have an adult-like intuition that beings might have physiological sensations (BODY) without social-emotional abilities (HEART) but not social-emotional abilities without physiological sensations—but may make an exception to this general rule for certain exceptional entities.
Children (4-6y)
In addition to building on the results of Studies 1 and 2 in re-assessing conceptual representations among adults and 7- to 9-year-old children, Study 3 also provided an initial foray into this aspect of conceptual representations among younger children (4-6y of age). In Chapter III, EFA suggested that 4- to 6-year-old children have only a nascent understanding of the suites of physiological sensations, social-emotional abilities, and perceptual-cognitive capacities that I have argued form the “conceptual units” of adults’ representations. Nonetheless, children in this age range may share other aspects of adults’ representations of this conceptual space. How do younger children’s representations of the relationships among BODY, HEART, and MIND compare to those of older children and adults?
Visualization and analysis of asymmetries
Visualizations of relationships among 4- to 6-year-old children’s scores on the BODY, HEART, and MIND scales are provided in Figure 4.6, row C. Here I combine my informal descriptions of these visualizations with formal analyses of difference scores between conceptual units, controlling for differences in assessments of the nine “diverse characters” that were featured as target characters in these studies. See Figure 4.7, panel C, for visual depictions of these difference scores, and Table 4.6 for the full results of these Bayesian regression analyses.
Prior to commenting on each of these comparisons individually, one striking feature of the visualizations of younger children’s responses is that they all look quite similar. Each pair of conceptual units is characterized by two suites of characters: (1) group of inanimate objects which, in the aggregate, received moderately low scores on all scales; and (2) a group of animate beings which, in the aggregate, received moderately high scores on all scales. This was more pronounced among younger children than in either of the other age groups.
BODY vs. HEART
As among adults and older children, the relationship between 4- to 6-year-olds BODY and HEART scores was positive (r = 0.74; p < 0.001; 95% CI: [0.65, 0.81]), and their difference scores were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.6). Again, this asymmetry appears to have been driven by responses to the animate beings (see Figure 4.7, panel C, and the various comparisons of target characters to the grand mean for the “BODY-HEART” comparison in Table 4.6). However, the visualization of 4- to 6-year-old children’s responses makes it clear that the asymmetry between BODY vs. HEART was quite weak, with only slightly more datapoints below than above the line of equivalence (\(y - x\), Figure 4.7, panel C1).
BODY vs. MIND
As among adults and older children, the relationship between 4- to 6-year-olds BODY and MIND scores was positive (r = 0.56; p < 0.001; 95% CI: [0.43, 0.67]). Younger children’s BODY vs. MIND difference scores were substantially non-zero—but this asymmetry ran in the opposite direction of older children and adults, with children endorsing MIND items less strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.6). This asymmetry appears to have been driven by responses to animate beings. (See Figure 4.7, panel C, and the various comparisons of target characters to the grand mean for the “BODY-HEART” comparison in Table 4.6.) Again, however, the visualization of 4- to 6-year-old children’s responses makes it clear that the asymmetry between BODY vs. MIND was quite weak, with only slightly more datapoints below than above the line of equivalence (\(y - x\), Figure 4.7, panel C2).
HEART vs. MIND
As among adults and older children, the relationship between 4- to 6-year-olds HEART and MIND scores was positive (r = 0.59; p < 0.001; 95% CI: [0.46, 0.69]). However, in contrast to adults and older children, younger children’s HEART vs. MIND difference scores did not differ substantially from zero, and varied only subtly across target characters. (See Figure 4.7, panel C, and the various comparisons of target characters to the grand mean for the “BODY-HEART” comparison in Table 4.6.)
Interim discussion and general observations about development
Both informal observations and formal analyses of difference scores suggested that, like adults in all studies and like older children in this study, 4- to 6-year-old children tended to endorse BODY more strongly than HEART. However, these younger children diverged from their older counterparts by systematically endorsing BODY more strongly than MIND, and by failing to show any systematic asymmetry between HEART and MIND.
Developmental comparison
General developmental trends across these three age groups are perhaps easiest to observe in Figure 4.6, row D, which presents (hypothetical) “movement” between the mean placement for a target character among younger children (beginning of arrow), among older children (middle “joint” of arrow), and among adults (arrowhead), for each pair of conceptual units. In each case, this “movement” either maintains a similar distance from the line of equivalence (\(y = x\)) (as with mean assessments of the inert objects and technologies in the BODY vs. HEART space, panel D1; and the inert objects and animate beings in the BODY vs. MIND space, panel D2; and the inert objects in the HEART vs. MIND space, panel D3) or moves away from the line of equivalence toward the upper left and lower right corners of the plot (as with mean assessments of the animate beings in the BODY vs. HEART space, panel D1; the technologies in the BODY vs. MIND space, panel D2; and the technologies and animate beings in the HEART vs. MIND space, panel D3). Analysis of changes in absolute attributions of BODY, HEART, and MIND, is pursued in Chapter V; for the purposes of the current chapter, the primary observation of interest is that these “shifts” between child and adult assessments of these characters generally point in the direction of stable or increasing (not decreasing) asymmetries over developmental time. This aligns quite well with my observations of “movement” between 7-9y and adulthood in Study 2.
To assess the size and robustness of these apparent developmental differences, I conducted formal comparisons of difference scores between conceptual units among these two age groups. For each pair of conceptual units, I pooled data from the three age groups and modified my regression analyses to include a main effect of age group (comparing both older and younger children’s difference scores to the baseline set by adults) and an interaction between age group and target character (assessing whether the observed differences between characters varied by age group).
These analyses confirmed that BODY vs. HEART difference scores and HEART vs. MIND difference scores were substantially closer to zero among both older and younger children, as compared to adults (see the “Older vs. adults” and “Younger children vs. adults” rows for the “BODY-HEART” and “HEART-MIND” comparisons in Table 4.7).
Meanwhile, BODY vs. MIND difference scores were not differentiable from adults among older children in this analysis—likely because this was the weakest of the asymmetries among adults. In contrast, the asymmetry between BODY and MIND scores was so substantially different among younger children, compared to adults, that it reversed in sign (see the “Older vs. adults” and “Younger children vs. adults” rows for the “BODY-MIND” comparison in Table 4.7).
For each pair of conceptual units, a handful of the differences between target characters differed substantially across age groups (see Table 4.7); this is outside of the scope of the current chapter.
Discussion
Study 3 provides yet more confirmation of the robustness of the asymmetric relationships among conceptual units in adults’ representations of mental life as revealed by Studies 1 and 2 (using yet another experimental paradigm, a smaller set of mental capacities, and a different set of diverse target characters): Yet again, adults systematically endorsed both BODY and MIND at least as strongly, and often more strongly, than HEART regardless of which target character they assessed, while the relationship between BODY and MIND was more contingent on the target character under evaluation.
This study also supports and extends the developmental story that began in Study 2. Study 3 provides even stronger evidence than Study 2 that, by middle childhood (7-9y of age), children hold weak but otherwise adult-like intuitions about the asymmetrical relationships among BODY, HEART, and MIND: Among this sample of 7- to 9-year-old children, these relationships all appeared similar in direction to those documented among adults, although they were generally attenuated in strength. In particular, the use of a diverse range of target characters in Study 3 shed light on the failure of 7- to 9-year-old children in Study 2 to demonstrate an adult-like pattern of endorsing BODY more strongly than HEART to the “edge cases” featured in that study (the beetle and the robot): In Study 3 older children’s responses suggested that children in this age range do in fact appear to share this tendency with adults when confronted with most target characters, but may treat robots as a a particular exception to this general rule.
In fact, this particular leg of the adult pattern of asymmetrical relationships among BODY, HEART, and MIND—a tendency to endorse BODY more strongly than HEART—appeared to be emergent even among the sample of younger children (4-6y of age) in this study. However, these younger children showed no sign of systematically endorsing MIND more strongly than HEART—and actually showed the opposite of the adult tendency in the case of BODY vs. MIND, endorsing BODY more strongly than MIND for most target characters.


Table 4.6: Regression analyses of difference scores among US adults, older children (7-9y of age), and younger children (4-6y of age) in Study 3. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included nine fixed effect parameters: (1) the intercept, which I treat as an index of the asymmetry in attributions of the two conceptual units in question; and (2-9) a set of parameters estimating the difference between target characters and the grand mean (GM). The intercepts are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
|
Adults |
Children, 7-9y (using adults' scales) |
Children, 4-6y (using adults' scales) |
| Parameter |
b |
95% CI |
|
b |
95% CI |
|
b |
95% CI |
|
| BODY - HEART |
| Intercept |
0.29 |
[ 0.24, 0.33] |
* |
0.07 |
[ 0.03, 0.11] |
* |
0.14 |
[ 0.09, 0.18] |
* |
| Elephant vs. GM |
0.03 |
[-0.08, 0.13] |
|
0.04 |
[-0.07, 0.16] |
|
0.08 |
[-0.04, 0.20] |
|
| Goat vs. GM |
0.24 |
[ 0.14, 0.34] |
* |
0.10 |
[-0.02, 0.21] |
|
0.19 |
[ 0.06, 0.31] |
* |
| Mouse vs. GM |
0.45 |
[ 0.32, 0.59] |
* |
0.09 |
[-0.02, 0.20] |
|
0.17 |
[ 0.05, 0.30] |
* |
| Bird vs. GM |
0.06 |
[-0.05, 0.18] |
|
0.18 |
[ 0.06, 0.30] |
* |
0.19 |
[ 0.07, 0.31] |
* |
| Beetle vs. GM |
0.36 |
[ 0.23, 0.48] |
* |
0.02 |
[-0.10, 0.13] |
|
0.21 |
[ 0.10, 0.33] |
* |
| Teddy bear vs. GM |
-0.33 |
[-0.49, -0.16] |
* |
-0.04 |
[-0.14, 0.07] |
|
-0.25 |
[-0.40, -0.11] |
* |
| Doll vs. GM |
-0.30 |
[-0.40, -0.19] |
* |
-0.14 |
[-0.26, -0.03] |
* |
-0.14 |
[-0.27, -0.01] |
* |
| Robot vs. GM |
-0.27 |
[-0.37, -0.16] |
* |
-0.18 |
[-0.30, -0.06] |
* |
-0.37 |
[-0.50, -0.25] |
* |
| BODY - MIND |
| Intercept |
-0.06 |
[-0.10, -0.03] |
* |
0.11 |
[ 0.06, 0.15] |
* |
-0.01 |
[-0.05, 0.03] |
|
| Elephant vs. GM |
0.12 |
[ 0.04, 0.21] |
* |
0.12 |
[-0.02, 0.26] |
|
0.19 |
[ 0.08, 0.29] |
* |
| Goat vs. GM |
0.20 |
[ 0.12, 0.28] |
* |
0.17 |
[ 0.03, 0.31] |
* |
0.25 |
[ 0.13, 0.37] |
* |
| Mouse vs. GM |
0.14 |
[ 0.03, 0.25] |
* |
0.26 |
[ 0.13, 0.40] |
* |
0.21 |
[ 0.09, 0.32] |
* |
| Bird vs. GM |
0.06 |
[-0.03, 0.15] |
|
0.07 |
[-0.08, 0.22] |
|
0.25 |
[ 0.13, 0.37] |
* |
| Beetle vs. GM |
0.15 |
[ 0.06, 0.25] |
* |
-0.01 |
[-0.16, 0.13] |
|
0.10 |
[-0.01, 0.21] |
|
| Teddy bear vs. GM |
0.12 |
[-0.02, 0.25] |
|
-0.14 |
[-0.27, -0.01] |
* |
0.08 |
[-0.06, 0.22] |
|
| Doll vs. GM |
0.05 |
[-0.03, 0.14] |
|
-0.14 |
[-0.28, 0.00] |
|
-0.07 |
[-0.20, 0.05] |
|
| Robot vs. GM |
-0.56 |
[-0.64, -0.48] |
* |
-0.09 |
[-0.23, 0.06] |
|
-0.52 |
[-0.64, -0.40] |
* |
| HEART - MIND |
| Intercept |
-0.35 |
[-0.40, -0.30] |
* |
0.03 |
[-0.02, 0.08] |
|
-0.14 |
[-0.21, -0.08] |
* |
| Elephant vs. GM |
0.10 |
[-0.02, 0.22] |
|
0.08 |
[-0.07, 0.21] |
|
0.11 |
[-0.05, 0.26] |
|
| Goat vs. GM |
-0.04 |
[-0.16, 0.07] |
|
0.07 |
[-0.06, 0.21] |
|
0.06 |
[-0.11, 0.24] |
|
| Mouse vs. GM |
-0.32 |
[-0.48, -0.16] |
* |
0.17 |
[ 0.04, 0.31] |
* |
0.04 |
[-0.13, 0.21] |
|
| Bird vs. GM |
0.00 |
[-0.13, 0.14] |
|
-0.12 |
[-0.27, 0.04] |
|
0.06 |
[-0.11, 0.23] |
|
| Beetle vs. GM |
-0.20 |
[-0.36, -0.05] |
* |
-0.03 |
[-0.17, 0.11] |
|
-0.12 |
[-0.28, 0.04] |
|
| Teddy bear vs. GM |
0.44 |
[ 0.24, 0.65] |
* |
-0.10 |
[-0.23, 0.02] |
|
0.33 |
[ 0.14, 0.53] |
* |
| Doll vs. GM |
0.35 |
[ 0.22, 0.48] |
* |
0.00 |
[-0.14, 0.15] |
|
0.07 |
[-0.11, 0.24] |
|
| Robot vs. GM |
-0.29 |
[-0.41, -0.17] |
* |
0.09 |
[-0.06, 0.24] |
|
-0.14 |
[-0.30, 0.03] |
|
Table 4.7: Regression analyses of differences in difference scores between US adults and both older children (7-9y of age) and younger children (4-6y of age) in Study 3. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included 27 fixed effect parameters: (1) the intercept (for adults), which I treat as an index of the asymmetry in attributions of the two conceptual units in question among adults; (2-3) the overall differences between older children vs. adults and younger children vs. adults (collapsing across target characters); (4-11) a set of parameters estimating the difference between target characters and the grand mean (GM), among adults; and (12-27) the interactions between these difference between target characters and the differences between age groups. The developmental comparisons of the intercepts are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
|
Developmental comparison |
| Parameter |
b |
95% CI |
|
| BODY - HEART |
| Intercept |
0.29 |
[ 0.24, 0.33] |
* |
| Older children vs. adults |
-0.15 |
[-0.21, -0.09] |
* |
| Younger children vs. adults |
-0.21 |
[-0.28, -0.15] |
* |
| Elephant vs. GM |
0.03 |
[-0.09, 0.14] |
|
| Goat vs. GM |
0.24 |
[ 0.13, 0.35] |
* |
| Mouse vs. GM |
0.46 |
[ 0.31, 0.61] |
* |
| Bird vs. GM |
0.06 |
[-0.06, 0.18] |
|
| Beetle vs. GM |
0.36 |
[ 0.23, 0.49] |
* |
| Teddy bear vs. GM |
-0.33 |
[-0.50, -0.16] |
* |
| Doll vs. GM |
-0.30 |
[-0.41, -0.18] |
* |
| Robot vs. GM |
-0.27 |
[-0.37, -0.16] |
* |
| Older children vs. adults * Elephant vs. GM |
0.05 |
[-0.10, 0.21] |
|
| Older children vs. adults * Goat vs. GM |
-0.06 |
[-0.22, 0.09] |
|
| Older children vs. adults * Mouse vs. GM |
-0.29 |
[-0.47, -0.10] |
* |
| Older children vs. adults * Bird vs. GM |
0.13 |
[-0.03, 0.30] |
|
| Older children vs. adults * Beetle vs. GM |
-0.14 |
[-0.31, 0.03] |
|
| Older children vs. adults * Teddy bear vs. GM |
0.07 |
[-0.15, 0.29] |
|
| Older children vs. adults * Doll vs. GM |
0.15 |
[-0.02, 0.33] |
|
| Older children vs. adults * Robot vs. GM |
-0.11 |
[-0.27, 0.05] |
|
| Younger children vs. adults * Elephant vs. GM |
0.02 |
[-0.15, 0.18] |
|
| Younger children vs. adults * Goat vs. GM |
-0.14 |
[-0.30, 0.02] |
|
| Younger children vs. adults * Mouse vs. GM |
-0.36 |
[-0.56, -0.18] |
* |
| Younger children vs. adults * Bird vs. GM |
0.12 |
[-0.04, 0.30] |
|
| Younger children vs. adults * Beetle vs. GM |
-0.34 |
[-0.52, -0.17] |
* |
| Younger children vs. adults * Teddy bear vs. GM |
0.29 |
[ 0.09, 0.49] |
* |
| Younger children vs. adults * Doll vs. GM |
0.15 |
[-0.02, 0.32] |
|
| Younger children vs. adults * Robot vs. GM |
0.09 |
[-0.07, 0.25] |
|
| BODY - MIND |
| Intercept |
-0.06 |
[-0.11, -0.02] |
* |
| Older children vs. adults |
0.05 |
[-0.01, 0.12] |
|
| Younger children vs. adults |
0.17 |
[ 0.11, 0.23] |
* |
| Elephant vs. GM |
0.12 |
[ 0.00, 0.24] |
* |
| Goat vs. GM |
0.20 |
[ 0.09, 0.30] |
* |
| Mouse vs. GM |
0.14 |
[ 0.00, 0.28] |
* |
| Bird vs. GM |
0.06 |
[-0.05, 0.18] |
|
| Beetle vs. GM |
0.15 |
[ 0.02, 0.29] |
* |
| Teddy bear vs. GM |
0.12 |
[-0.05, 0.29] |
|
| Doll vs. GM |
0.05 |
[-0.06, 0.16] |
|
| Robot vs. GM |
-0.56 |
[-0.66, -0.45] |
* |
| Older children vs. adults * Elephant vs. GM |
0.07 |
[-0.09, 0.23] |
|
| Older children vs. adults * Goat vs. GM |
0.06 |
[-0.11, 0.22] |
|
| Older children vs. adults * Mouse vs. GM |
0.07 |
[-0.11, 0.25] |
|
| Older children vs. adults * Bird vs. GM |
0.19 |
[ 0.03, 0.36] |
* |
| Older children vs. adults * Beetle vs. GM |
-0.05 |
[-0.23, 0.12] |
|
| Older children vs. adults * Teddy bear vs. GM |
-0.04 |
[-0.26, 0.17] |
|
| Older children vs. adults * Doll vs. GM |
-0.13 |
[-0.29, 0.04] |
|
| Older children vs. adults * Robot vs. GM |
0.04 |
[-0.12, 0.20] |
|
| Younger children vs. adults * Elephant vs. GM |
0.00 |
[-0.17, 0.17] |
|
| Younger children vs. adults * Goat vs. GM |
-0.02 |
[-0.18, 0.13] |
|
| Younger children vs. adults * Mouse vs. GM |
0.13 |
[-0.06, 0.31] |
|
| Younger children vs. adults * Bird vs. GM |
0.00 |
[-0.17, 0.18] |
|
| Younger children vs. adults * Beetle vs. GM |
-0.16 |
[-0.34, 0.02] |
|
| Younger children vs. adults * Teddy bear vs. GM |
-0.26 |
[-0.47, -0.06] |
* |
| Younger children vs. adults * Doll vs. GM |
-0.19 |
[-0.35, -0.02] |
* |
| Younger children vs. adults * Robot vs. GM |
0.47 |
[ 0.30, 0.64] |
* |
| HEART - MIND |
| Intercept |
-0.35 |
[-0.40, -0.29] |
* |
| Older children vs. adults |
0.20 |
[ 0.13, 0.28] |
* |
| Younger children vs. adults |
0.38 |
[ 0.31, 0.46] |
* |
| Elephant vs. GM |
0.10 |
[-0.05, 0.23] |
|
| Goat vs. GM |
-0.05 |
[-0.18, 0.08] |
|
| Mouse vs. GM |
-0.32 |
[-0.50, -0.14] |
* |
| Bird vs. GM |
0.00 |
[-0.15, 0.14] |
|
| Beetle vs. GM |
-0.21 |
[-0.37, -0.04] |
* |
| Teddy bear vs. GM |
0.45 |
[ 0.23, 0.66] |
* |
| Doll vs. GM |
0.35 |
[ 0.21, 0.49] |
* |
| Robot vs. GM |
-0.29 |
[-0.42, -0.16] |
* |
| Older children vs. adults * Elephant vs. GM |
0.01 |
[-0.19, 0.21] |
|
| Older children vs. adults * Goat vs. GM |
0.11 |
[-0.09, 0.31] |
|
| Older children vs. adults * Mouse vs. GM |
0.36 |
[ 0.14, 0.59] |
* |
| Older children vs. adults * Bird vs. GM |
0.06 |
[-0.14, 0.26] |
|
| Older children vs. adults * Beetle vs. GM |
0.09 |
[-0.12, 0.31] |
|
| Older children vs. adults * Teddy bear vs. GM |
-0.12 |
[-0.40, 0.15] |
|
| Older children vs. adults * Doll vs. GM |
-0.28 |
[-0.49, -0.08] |
* |
| Older children vs. adults * Robot vs. GM |
0.15 |
[-0.06, 0.35] |
|
| Younger children vs. adults * Elephant vs. GM |
-0.02 |
[-0.22, 0.19] |
|
| Younger children vs. adults * Goat vs. GM |
0.12 |
[-0.08, 0.31] |
|
| Younger children vs. adults * Mouse vs. GM |
0.49 |
[ 0.27, 0.72] |
* |
| Younger children vs. adults * Bird vs. GM |
-0.12 |
[-0.33, 0.09] |
|
| Younger children vs. adults * Beetle vs. GM |
0.18 |
[-0.05, 0.41] |
|
| Younger children vs. adults * Teddy bear vs. GM |
-0.55 |
[-0.81, -0.30] |
* |
| Younger children vs. adults * Doll vs. GM |
-0.34 |
[-0.55, -0.12] |
* |
| Younger children vs. adults * Robot vs. GM |
0.38 |
[ 0.18, 0.59] |
* |
Study 4: A focus on early childhood (4-5y)
Study 4 builds on Study 3 by providing a targeted investigation of representations of mental life in the preschool years (4-5y). In this chapter, I again focus on what this study can reveal about the relationships among the conceptual units BODY, HEART, and MIND at the earliest point in development that I have examined so far, and compare this conceptual organization to that documented among adults. As a reminder, in this chapter I analyze young children’s responses with respect to the “mature” conceptual units BODY, HEART, and MIND, as defined by EFA of adults’ responses (see [XX APPENDIX B?] for further analyses with respect to the conceptual units identified through EFA of children’s own mental capacity attributions, as presented in Chapter III).
In Study 4, 104 US adults and 43 US children between the ages of 4.02-5.59 years (median: 4.73y) each assessed two target characters on 18 mental capacities, with all aspects of the experimental design tailored to be appropriate for this youngest age group. This study employed the “edge case” variant of the general approach, with participants assessing both a beetle or a robot in sequence (with order counterbalanced across participants). (See Chapter II for detailed methods.)
Results
Adults
Scale construction
Following the steps described in the “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 5 items each; see Table 4.10.
Visualization
Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.8, row A. These visualizations are all extremely similar to those discussed at length in previous studies featuring these “edge case” target characters (Studies 1a-1c, Study 2); I will not describe them further here.
Analysis of asymmetries
Here I provide a formal analysis of the asymmetries between endorsements of BODY, HEART, and MIND. As in previous studies, for each pair of conceptual units, I conduct a Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the two “edge cases” that were featured as target characters in these studies. As in Study 1d, I account for the within-subjects design by including maximal random effects structures (in this case, random intercepts for participants). See Figure 4.9, panel D, for visual depictions of these difference scores.
BODY vs. HEART
As in previous studies, adults’ BODY vs. HEART difference scores were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.8), and this asymmetry was driven primarily by participants’ assessments of the beetle. (See Figure 4.9, panel A, and the “Robot vs. GM” row for the “BODY-HEART” comparison in Table 4.8.)
BODY vs. MIND
As in previous studies, adults’ BODY vs. MIND difference scores were substantially non-zero, in the direction of participants endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.8), and this asymmetry was driven primarily by participants’ assessments of the robot. Indeed, in this study, this asymmetry actually tended to go in the opposite direction for participants’ assessments of the beetle (BODY endorsements stronger than MIND endorsements), echoing children’s response patterns in previous studies. (See Figure 4.9, panel A, and the “Robot vs. GM” row for the “BODY-MIND” comparison in Table 4.8.)
HEART vs. MIND
As in previous studies, adults’ HEART vs. MIND difference scores were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.8), and this asymmetry was somewhat exaggerated in assessments of the robot. (See Figure 4.9, panel A, and the “Robot vs. GM” row for the “HEART-MIND” comparison in Table 4.8.)
Interim discussion
Like adults in Studies 1-3, adults in Study 4 tended to endorse BODY and MIND more strongly than HEART. As in previous studies that used the “edge case” variant of the experimental approach, this study also revealed an asymmetry between BODY and MIND, with adults tending to attribute MIND more strongly than BODY—however, this asymmetry was limited to assessments of the robot, and if anything ran in the opposite direction for assessments of the beetle.
Children (4-5y)
Study 4 was expressly designed to provide the best chance of observing adult-like conceptual representations among 4- to 5-year-old children. What did the relationships among BODY, HEART, and MIND look like in this age group under these circumstances?
Visualization
Visualizations of relationships among scores on adults’ BODY, HEART, and MIND scales are provided in Figure 4.8, row B.
BODY vs. HEART
First I consider the relationship between BODY and HEART (Figure 4.8, panel B1). As among adults in this study (panel A1), the relationship between scores on the BODY and HEART scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints above the line of equivalence (\(y = x\), dotted diagonal line) than below it—but both of these observations are much less striking among children than they were among adults. While, like the vast majority of adults, many children attributed more BODY than HEART to the target character in question (particularly to the beetle, in red), quite a few children attributed more HEART than BODY (particularly to the robot, in blue).
BODY vs. MIND
Next I consider the relationship between BODY and MIND (Figure 4.8, panel B2). As among adults in this study (panel A2), the relationship between scores on the BODY and MIND scales appears to be somewhat positive. However, there was no obvious evidence of any asymmetry in children’s attributions of these two conceptual units. In other words, while, like the majority of adults, some children attributed more MIND than BODY to the target character in question (particularly to the robot, in blue), other children attributed more BODY than MIND (particularly to the beetle, in red).
HEART vs. MIND
Finally I consider the relationship between HEART and MIND (Figure 4.8, panel B3). As among adults in this study (panel A3), the relationship between scores on the HEART and MIND scales appears to be positive, and there appear to be somewhat fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it—but, as in the previous sections, both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more MIND than HEART to the target character in question (like the vast majority of adults), quite a few children attributed at least slightly more HEART than MIND. This appears to have been true for both target characters.
General observations about development
For each pair of conceptual units, these visualizations suggest that children’s responses were generally less asymmetrical than those of adults. This is perhaps easiest to observe in Figure 4.8, row D, which presents (hypothetical) “movement” between the mean placement for a target character among children (beginning of arrow) and the mean placement for a target character among adults (arrowhead), for each pair of conceptual units. In each case, this “movement” either maintains a similar distance from the line of equivalence (\(y = x\)) (as with mean assessments of the robot in the BODY vs. HEART space, panel D1; and the beetle in the BODY vs. MIND space, panel D2) or moves away from the line of equivalence toward the upper left and lower right corners of the plot (as with mean assessments of the beetle in the BODY vs. HEART space, panel D1; the robot in the BODY vs. MIND space, panel D2; and both characters in the HEART vs. MIND space, panel D3). Analysis of changes in absolute attributions of BODY, HEART, and MIND, is pursued in Chapter V; for the purposes of the current chapter, the primary observation of interest is that these “shifts” between child and adult assessments of these characters generally point in the direction of stable or increasing (not decreasing) asymmetries over developmental time.
Analysis of asymmetries
Here I provide a formal analysis of these asymmetries among conceptual units, controlling for differences in assessments of the two “edge cases” that were featured as target characters in these studies (beetle and robot), and accounting for the within-subjects design of this study by including maximal random effects structures (in this case, random intercepts for participants). See Figure 4.9, panel B, for visual depictions of these difference scores.
BODY vs. HEART
As among adults, among children BODY vs. HEART difference scores were significantly non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.8). However, this asymmetry was reduced to zero for assessments of the robot (see Figure 4.9, panel B, and the “Robot vs. GM” row for the “BODY-HEART” comparison in Table 4.8).
BODY vs. MIND
In contrast to adults, among children BODY vs. MIND difference scores were not differentiable from zero (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.8). This appears to be due to the fact that the asymmetry ran in different directions for the two target characters (see Figure 4.9, panel B, and the “Robot vs. GM” row for the “BODY-MIND” comparison in Table 4.8).
HEART vs. MIND
As among adults, among children HEART vs. MIND difference scores were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.8); this difference did not vary across target characters (see the “Robot vs. GM” row for the “HEART-MIND” comparison in Table 4.8).
Interim discussion
Using a particularly child-friendly paradigm, 4- to 5-year-old children were relatively “adult-like”" in their tendencies to endorse BODY and MIND more strongly than HEART, but failed to show the adult-like tendency to endorse MIND more strongly than BODY for these two edge cases. Instead, like older children in Studies 2 and 3, the asymmetry between BODY and MIND appeared to be highly contingent on which target was being assessed.

Developmental comparison
In the previous sections, I analyzed adults’ and children’s responses separately. Here I conduct a formal comparison of difference scores between conceptual units among these two age groups, to assess the size and robustness of these ostensive developmental differences. I pooled data from both age groups and modified my regression analyses to include a main effect of age group (comparing children’s difference scores to the baseline set by adults) and an interaction between age group and target character (assessing whether the observed differences between characters varied by age group).
For each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, HEART vs. MIND), children’s difference scores were substantially attenuated (closer to zero), as compared to adults (see the “Children vs. adults” rows for each comparison in Table 4.9), and the difference between target characters was also attenuated among children (see the “Robot vs. GM” rows for each comparison in Table 4.9).
Discussion
Study 4 provides yet more confirmation of the robustness of the asymmetric relationships among conceptual units in adults’ representations of mental life as revealed by Studies 1-3 (using yet another set of mental capacities and a within-subjects design): Yet again, adults systematically endorsed both BODY and MIND at least as strongly, and often more strongly, than HEART regardless of which target character they assessed, while the relationship between BODY and MIND was contingent on the target character under evaluation.
This study also supports and extends the developmental story that unfolded through Studies 2 and 3. As in Study 3, the young children (4-5y of age) in this study showed an adult-like tendency to endorse BODY more strongly than HEART. Morever, in this particularly child-friendly experimental paradigm, these children also showed an emergent adult-like tendency to endorse MIND more strongly than HEART, though this asymmetry was much weaker among children than among adults. In contrast to the un-adult-like tendency among “younger” (4- to 6-year-old) children in Study 3 to endorse BODY more strongly than MIND, in Study 3 the relationship between BODY and MIND among the young children in this sample varied by target character, much as it did among adults. In sum, in all respects the 4- to 5-year-old children in this study demonstrated a more adult-like (albeit attenuated) sense of the relationships among BODY, HEART, and MIND than their similar-aged peers in Study 3.

Table 4.8: Regression analyses of difference scores among US adults and children (4-5y of age) in Study 4. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included two fixed effect parameters: (1) the intercept, which I treat as an index of the asymmetry in attributions of the two conceptual units in question; and (2) a difference between target characters, reported here as a difference between the robot and the grand mean (GM). The intercepts are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
|
Adults |
Children, 4-6y (using adults' scales) |
| Parameter |
b |
95% CI |
|
b |
95% CI |
|
| BODY - HEART |
| Intercept |
0.27 |
[ 0.24, 0.31] |
* |
0.10 |
[ 0.03, 0.16] |
* |
| Robot vs. GM |
-0.27 |
[-0.31, -0.24] |
* |
-0.17 |
[-0.23, -0.11] |
* |
| BODY - MIND |
| Intercept |
-0.20 |
[-0.24, -0.17] |
* |
-0.01 |
[-0.08, 0.05] |
|
| Robot vs. GM |
-0.37 |
[-0.40, -0.34] |
* |
-0.18 |
[-0.24, -0.12] |
* |
| HEART - MIND |
| Intercept |
-0.48 |
[-0.52, -0.43] |
* |
-0.11 |
[-0.17, -0.04] |
* |
| Robot vs. GM |
-0.10 |
[-0.14, -0.06] |
* |
-0.02 |
[-0.07, 0.04] |
|
Table 4.9: Regression analyses of differences in difference scores between US adults and children (4-5y of age) difference scores in Study 4. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included four fixed effect parameters: (1) the intercept (for adults), which I treat as an index of the asymmetry in attributions of the two conceptual units in question among adults; (2) the overall difference between children and adults (collapsing across target characters); (3) a difference between target characters (among adults), reported here as a difference between the robot and the grand mean (GM); and (4) the interaction between this difference between target characters and the difference between age groups. The developmental comparisons are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
|
Developmental comparison |
| Parameter |
b |
95% CI |
|
| BODY - HEART |
| Intercept |
0.27 |
[ 0.24, 0.31] |
* |
| Children vs. adults |
-0.18 |
[-0.24, -0.11] |
* |
| Robot vs. GM |
-0.27 |
[-0.31, -0.24] |
* |
| Interaction |
0.11 |
[ 0.04, 0.17] |
* |
| BODY - MIND |
| Intercept |
-0.20 |
[-0.24, -0.17] |
* |
| Children vs. adults |
0.19 |
[ 0.13, 0.26] |
* |
| Robot vs. GM |
-0.37 |
[-0.41, -0.34] |
* |
| Interaction |
0.19 |
[ 0.12, 0.25] |
* |
| HEART - MIND |
| Intercept |
-0.48 |
[-0.52, -0.43] |
* |
| Children vs. adults |
0.37 |
[ 0.29, 0.45] |
* |
| Robot vs. GM |
-0.10 |
[-0.13, -0.06] |
* |
| Interaction |
0.08 |
[ 0.01, 0.15] |
* |
Table 4.10: Scales for each of the conceptual units (factors) identified by EFA for US Adults in Studies 2-4 and for 7- to 9-year-old children in Studies 2 and 3. (See Appendix B for alternative scales based on younger children's EFA results, for Studies 3 and 4.) A checkmark indicates that a mental capacity was included in a scale for a particular sample.
|
Study 2 |
Study 3 |
Study 4 |
| Capacity |
Adults |
Children, 7-9y |
Adults |
Children, 7-9y |
Adults |
| BODY scale |
| get/feel hungry |
✓ |
✓ |
✓ |
✓ |
✓ |
| feel pain |
✓ |
✓ |
✓ |
✓ |
|
| feel/get scared |
✓ |
✓ |
✓ |
✓ |
|
| feel tired |
✓ |
✓ |
✓ |
✓ |
✓ |
| feel safe |
✓ |
|
|
|
|
| smell things |
✓ |
✓ |
✓ |
✓ |
✓ |
| get/feel sick[...] |
|
✓ |
✓ |
|
✓ |
| get thirsty |
|
|
|
|
✓ |
| get angry |
|
|
|
✓ |
|
| HEART scale |
| feel proud |
✓ |
✓ |
✓ |
✓ |
|
| feel joy |
✓ |
✓ |
|
|
|
| feel/get sad |
✓ |
✓ |
✓ |
✓ |
✓ |
| feel happy |
✓ |
✓ |
|
|
|
| feel love/love someone |
✓ |
✓ |
✓ |
✓ |
✓ |
| feel guilty/sorry |
✓ |
|
✓ |
✓ |
✓ |
| get hurt feelings |
|
✓ |
✓ |
✓ |
|
| feel embarrassed |
|
|
✓ |
✓ |
|
| hate someone |
|
|
|
|
✓ |
| get lonely |
|
|
|
|
✓ |
| MIND scale |
| figure out how to do things/figure things out |
✓ |
✓ |
✓ |
✓ |
✓ |
| make choices |
✓ |
|
✓ |
✓ |
|
| recognize somebody else |
✓ |
|
|
|
|
| sense...far away |
✓ |
✓ |
✓ |
✓ |
|
| remember things |
✓ |
✓ |
✓ |
✓ |
✓ |
| see [things] |
✓ |
|
|
|
|
| be aware of itself |
|
✓ |
|
|
|
| be aware of things |
|
✓ |
✓ |
✓ |
|
| sense temperatures |
|
✓ |
✓ |
✓ |
|
| know stuff |
|
|
|
|
✓ |
| have thoughts/think |
|
|
|
|
✓ |
| hear [sounds] |
|
|
|
|
✓ |
General discussion
In this chapter, I focused on a second aspect of the development of conceptual representations of mental life: the relationships among the “conceptual units” identified among US adults in the previous chapter: BODY, HEART, and MIND. I focused in particular whether the mental capacity attributions documented by the studies included in this dissertation bring to light possible hierarchical relations among BODY, HEART, and MIND: Do these studies provide any evidence about which of these conceptual units might be more “basic” vs. more complex, or whether any of these conceptual units might be considered to depend on the presence of others? How might this conceptual organization change over development?

Table 4.11: Percentage of difference scores that were negative, zero, or positive for each pair of conceptual units across all studies and samples. For each sample, the final column gives the percentage of target character assessments that were either zero or went in the modal direction of asymmetry among adults for that pair of conceptual units (positive or BODY - HEART; negative for BODY - MIND and HEART - MIND).
|
Direction of asymmetry |
|
| Age group |
Study |
negative |
zero |
positive |
Modal adult tendency |
| BODY - HEART |
| Adults |
Study 1a |
11% |
35% |
54% |
89% |
| Study 1b |
8% |
31% |
61% |
92% |
| Study 1c |
7% |
36% |
57% |
93% |
| Study 1d |
5% |
19% |
76% |
95% |
| Study 2 |
6% |
26% |
68% |
94% |
| Study 3 |
4% |
39% |
57% |
96% |
| Study 4 |
5% |
40% |
55% |
95% |
| Children, 7-9y |
Study 2 |
41% |
12% |
47% |
59% |
| Study 3 |
23% |
16% |
61% |
77% |
| Children, 4-6y |
Study 3 |
25% |
29% |
46% |
75% |
| Study 4 |
29% |
24% |
47% |
71% |
| BODY - MIND |
| Adults |
Study 1a |
66% |
6% |
28% |
72% |
| Study 1b |
68% |
7% |
25% |
75% |
| Study 1c |
66% |
5% |
29% |
71% |
| Study 1d |
33% |
21% |
46% |
54% |
| Study 2 |
66% |
12% |
22% |
78% |
| Study 3 |
31% |
34% |
35% |
65% |
| Study 4 |
50% |
17% |
32% |
68% |
| Children, 7-9y |
Study 2 |
54% |
10% |
36% |
64% |
| Study 3 |
38% |
8% |
54% |
46% |
| Children, 4-6y |
Study 3 |
23% |
25% |
52% |
48% |
| Study 4 |
42% |
20% |
38% |
62% |
| HEART - MIND |
| Adults |
Study 1a |
94% |
3% |
2% |
98% |
| Study 1b |
94% |
3% |
2% |
98% |
| Study 1c |
96% |
3% |
1% |
99% |
| Study 1d |
85% |
11% |
4% |
96% |
| Study 2 |
96% |
2% |
2% |
98% |
| Study 3 |
72% |
25% |
3% |
97% |
| Study 4 |
90% |
8% |
2% |
98% |
| Children, 7-9y |
Study 2 |
64% |
11% |
24% |
76% |
| Study 3 |
56% |
17% |
27% |
73% |
| Children, 4-6y |
Study 3 |
35% |
22% |
44% |
56% |
| Study 4 |
45% |
26% |
29% |
71% |
Studies with adults using different experimental approaches (asking participants to assess the mental lives of edge cases or a diverse range of target characters), their between- vs. within-subjects design, the number and range of mental capacities included, and the response options available to participants all converged to suggest a robust hierarchical structure among BODY, HEART, and MIND among US adults: BODY and MIND appear to be more fundamental or “basic” conceptual units than HEART in adults’ representations of mental life.
My evidence for this claim is that, across all seven studies with adults, individual participants endorsed the physiological sensations of the BODY and the perceptual-cognitive abilities of the MIND at least as strongly, often more strongly, and almost never less strongly, than the social-emotional abilities of the HEART. See Figure 4.10 for a summary of difference scores in all studies (panel A) and intercepts from regression models comparing these difference scores to zero (paenl B).
These tendencies were strong and strikingly reliable: Across studies, 89-96% of individual adults’ assessments of target characters yielded BODY scores that were at least as high or higher than HEART scores, and fully 96-99% yielded MIND scores that were at least as high or higher than HEART scores (see Table 4.11, “BODY - HEART” and “HEART - MIND” sections; see also Figure 4.10, panel A, leftmost and rightmost columns). This is a remarkable level of consistency across participants and studies: Even though participants were responding to questions about individual mental capacities presented in a random order, with no explicit indication of which capacities would be grouped together to form “scales” in these analyses, and even though different participants were assessing different target characters and brining their own personal experiences with and beliefs about these characters to bear on their assessments, virtually no participants answered these questions in such a way as to indicate that any of the target characters included in these studies had more in the way of social-emotional abilities (HEART) than physiological sensations (BODY) or perceptual-cognitive abilities. (Indeed, only particpiants who granted at least moderate amounts of both BODY and MIND to a target character granted any substantial degree of HEART to this character; see [XX APPENDIX B].) I take these robust asymmetries to be strong evidence of a hierarchical organization of conceptual units: Among US adults, BODY and MIND appear to function as more “basic” or “fundamental” components of mental life than HEART.
In both of these cases, there were some intriguing hints from my holistic visualizations of relationships between scores on the BODY, HEART, and MIND scales that adults might have been relying on some sort of “threshold” model of these dependencies, such that a being must have a minimal degree or amount of capacities in the more basic domain (BODY or MIND) in order to have any degree or amount of capacities in the HEART domain. My evidence for this speculative claim is that, across studies, these visualizations tended to feature a large number of datapoints toward the “edges” of the plots, rather than toward the middle of the plot. For example, in the “edge case” studies (Studies 1a-1c, 2, and 4), only adults who granted the beetle or the robot at least a moderate degree of BODY and MIND abilities to the beetle granted that character any HEART abilities; likeiwse, in the “diverse characters” studies (Studies 1d and 3), only characters that were (in the aggregate) granted at least moderate degrees of BODY and MIND abillities were granted any HEART abilities. This kind of pattern appears to have been specific to relationships between BODY vs. HEART and MIND vs. HEART (not BODY vs. MIND). As I speculated in the discussion of adults’ results for individual studies, this could be evidence of adults’ mental capacity attributions being governed by some sort of “threshold” model, in which attributions of any substantial amount of HEART depend on the target character having a certain degree of BODY and MIND. This would be an interesting line of inquiry for future research.
In contrast to the robust asymmetries in adults’ attributions of BODY vs. HEART and MIND vs. HEART, their attributions of the two more “basic” conceptual units—BODY and MIND—were less robustly asymmetrical. On the whole, most assessments of target characters yielded MIND scores that were at least as high or higher than BODY scores—but in contrast to this modal response accounting for the vast majority of data in the other comparisons of conceptual units, this was true in only 54-78% across studies (see Table 4.11, “BODY - MIND” section; see also Figure 4.10, panel A, center column). In studies that featured “edge cases” as target characters (Studies 1a-1c, 2, and 4), this asymmetry (MIND more than BODY) tended to be limited to assessments of the robot; there was a fair degree of variability in whether individual participants attributed more BODY or more MIND to the beetle, and in one case (Study 4) the mean BODY score was actually higher than the mean MIND score for the beetle (see Figure 4.2, panels A-C; Figure 4.5, panel A; and Figure 4.9, panel A). Likewise, in studies that featured a wider range of “diverse characters” (Study 1d and Study 3), only technological “beings” reliably received higher MIND than BODY scores from adult participants, and certain other beings (e.g., immature humans, some non-human animals) tended to receive higher BODY than MIND scores (see Figure 4.2, panel D; and Figure 4.7, panel A). Taken together, I consider these findings to indicate that there is no general hierarchical relationship between BODY and MIND in US adults’ conceptual representations of mental life: Instead, adults appear to assess a being’s capacity for physiological sensation somewhat independently of its capacities for perception and cognition, and consider it quite plausible for different beings in the world to have relatively more or less of either of these aspects of mental life.
Of course, none of these conceptual units appears to be assessed completely independently of the others: Attributions of mental capacities in each of these domains were at least moderately correlated with each other (see Figure 4.10, panel C). For every pair of conceptual units, correlations between scores on the two relevant scales were almost always positive in adult samples (with the single exception of the adult sample in Study 2). The correlations between scores on the BODY and HEART scales appear to have been particularly strong (and reliable across studies) among adults; this privileged relationship between BODY and HEART might have its roots in early childhood—a point in development when children in this cultural context fail to draw a sharp distinction between physiological sensations and social-emotional abiltiies (as revealed by the analyses presented in Chapter III; see also Appendix A for an alternative set of exploratory factor analyses using an oblique rotation, which allows for an assessment of the correlations between factors themselves rather than an assessment of correlations between participants’ scores on these factors). More generally, the ubiquitous positive relationships between attributions of BODY, HEART, and MIND are, in my view, evidence that BODY, HEART, and MIND are indeed part of the same “concept” of mental life.
It would be fascinating to explore the nature and implications of the hierarchical relationships between BODY, HEART, and MIND in future work. In particular, do adults’ assessments reflect their perceptions of the co-occurence of mental capacities in the world, or might they reflect something deeper about their understanding of the causal systems that give rise to different aspects of mental life? In other words, do adults think it is impossible, or simply unlikely, for a being to have social-emotional abilities without being instantiated in a physiological body (BODY), or without having abilities to perceive and represent the environment (MIND)? How might such intuitive theories inform, or be informed by, people’s understanding of exceptional beings such as “social” technologies or spiritual/supernatural beings (who lack biological bodies)? One intriguing possibility is that adults consider the abilities subsumed under BODY and MIND to be prerequisites for the social-emotional abilities associated with HEART, and might have intuitive theories that specify how and why BODY and MIND abilities contribute to emotional experiences and social interactions, and inform adults’ beliefs about the existence, abiliites, and limitations of such exceptional entities as “social” technologies and spiritual or supernatural beings. I consider this to be an especially interesting directions for future work.
Beyond establishing an adult endpoint for this aspect of conceptual representations of mental life, the studies discussed in this chapter also provide a glimpse of the development of relationships among BODY, HEART, and MIND over the course of early and middle childhood (4-9y).
First, it is worth noting that, across studies, I observed generally positive relationships between conceptual units (the only exception being the BODY vs. MIND comparison for older children in Study 2; see Figure 4.10, panel C). As with adults, this provides some evidence that the mental capacities included in these studies are all part of the same conceptual space even for young children (namely, an understanding of “mental life”).
Beyond this, these studies suggest that, by the preschool years, children have an emerging understanding of the physiological sensations of the BODY and the perceptual-cognitive abilities of the MIND as being somehow more “basic” than the social-emotional abiltiies of the HEART—but that these asymmetries continue become stronger and more robust over the course of childhood (and perhaps extending into adolesence).
My evidence for this claim comes from the fact that, as among adults, among most of the child samples included in these studies participants’ mental capacity attributions yielded stronger BODY and MIND scores than HEART scores (see Figure 4.10, panels A and B). However, these two asymmetries—which I have taken to be signatures of hierarchical relationships between BODY vs. HEART and between HEART vs. MIND—all appeared to be much weaker in size and less reliable across studies than they were among adults. This was true even among 7- to 9-year-old children, whose “conceptual units” (BODY, HEART, and MIND) otherwise appear to be quite similar to that of adults (see Chapter III).
Meanwhile, in the BODY vs. MIND comparison, there was some indication that, early in development, children hold intuitions that differ from adults not only in degree (size of asymmetry) but perhaps in kind (direction of asymmetry). In all studies, adults tended to endorse MIND somewhat more strongly than BODY, in the aggregate (though as noted earlier, individual participants’ difference scores appears to be contingent on the target character they were assigned to assess). In contrast, in half of the child samples in these studies (7- to 9-year-old children in Study 3; 4- to 5-year-old children in Study 4) there was no systematic asymmetry in children’s BODY vs. MIND scores—and in one sample, (4- to 6-year-old children in Study 3), children actually demonstrated the opposite tendency, endorsing BODY more strongly, on average, than MIND.
Analyses that take into account children’s exact age offer even stronger evidence that the asymmetries between conceptual units generally become more adult-like—both in size and in direction—with increasing age, both among 7- to 9-year-olds in Study 2 and among 4- to 9-year-olds in Study 3 (see [XX APPENDIX B?]). (Analyses of Study 4 provides no evidence of shifts toward adult-like patterns among 4- to 5-year-olds, but this is not surprising given the smaller sample size and more restricted age range.)
In addition to the age-related changes in size (and perhaps direction) of the asymmetries among BODY, HEART, and MIND just described, there are some indications that these developmental differences may also reflect changes in the degree of consensus across individual participants with age. This is most striking for the BODY vs. HEART and HEART vs. MIND comparisons: In contrast to the strong consensus among adults in the direction of asymmetry for these two pairs of conceptual units (with 89-99% of individual assessments of target characters demonstrating the modal adult pattern of asymmetry; see discussion in previous paragraphs), across studies only 59-77% of asessments among older children and 56-75% among younger children conformed to the adult pattern of asymmetry. (See also Figure 4.10, panel A, for distributions of difference scores within each of the child samples.)
Taken together, this set of observations of differences across different age groups suggest that development in the organization of the conceptual units I have called BODY, HEART, and MIND may involve at least three kinds of changes: (1) Increases in the size of these asymmetries (i.e., the extremeness or strictness of these hierarchical relationships); (2) Changes in the direction of some of these asymmetries (namely, the relative “basic-ness” of BODY vs. MIND; and (3) Increases in the degree of consensus across individuals in whether BODY and/or MIND are treated as more basic than HEART.
Chapter conclusion
In this chapter, I explored a second aspect of conceptual representations of mental life among US children and adults: The relational organization of the three conceptual units—BODY, HEART, and MIND—that seem to anchor adults’ and older children’s understanding of mental life, as identified in Chapter III.
Studies 1-4 are consistent with the following theory: By the preschool years, US children treat physiological sensations (BODY) as particularly basic or fundamental aspects of mental life, and they quickly come to see perceptual-cognitive abilities (MIND) as roughly equally “basic.” In contrast, the social-emotional abilities of the HEART are perceived to be less basic, i.e., to occupy a different position in the hierarchical structure that characterizes this conceptual domain. Over the course of childhood—and extending beyond the oldest non-adult sample included in the current students (7-9y)—these hierarchical relationships become increasingly stark, applying more universally to any kind of “being” in the world, and the degree of consensus across indivdiuals increases. In its “mature” state, this hierarchical structure admits of virutally no exceptions: It governs mental capacity attributions to all kinds of target entities among all participants. Regardless of the degree to which a person attributes any particular mental capacity to any particular being in the world, US adults virtually never violate the rule that in order to have any social-emotional abilities (HEART), a being must also have some degree of physiological sensations (BODY) and perceptual-cognitive abilities (MIND). The re-analyses discussed in this chapter formed the basis of this theory and lay the foundation for future confirmatory tests and extensions of this theory.
In the next chapter, I apply the same exploratory spirit to a third and final aspect of conceptual representations of mental life: the application or deployment of these conceptual units in reasoning about various kinds of beings.
LS0tCnRpdGxlOiAiQ2hhcHRlciBJVjogQ2hhbmdlcyBpbiBvcmdhbml6YXRpb24gb2YgY29uY2VwdHVhbCB1bml0cyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICB0b2NfZmxvYXQ6IHllcwphbHdheXNfYWxsb3dfaHRtbDogeWVzCi0tLQoKYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNjcsCiAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gRiwgZWNobyA9IEYpCmBgYAoKYGBge3J9CiMgIyBmb3Iga25pdHRpbmcgdG8gLmRvY3gKIyBvdXRwdXQ6CiMgICB3b3JkX2RvY3VtZW50OgojICAgICByZWZlcmVuY2VfZG9jeDogIi4vc3RvcmVkL3dvcmQtc3R5bGVzLXJlZmVyZW5jZS5kb2N4IgojIGFsd2F5c19hbGxvd19odG1sOiB5ZXMKCiMgIyBmb3Iga25pdHRpbmcgdG8gLm5iLmh0bWwgCiMgb3V0cHV0OgojICAgaHRtbF9ub3RlYm9vazoKIyAgICAgdG9jOiB5ZXMKIyAgICAgdG9jX2RlcHRoOiA0CiMgICAgIHRvY19mbG9hdDogeWVzCmBgYAoKYGBge3J9CiMgcnVuIHVyLXNldHVwIHNjcmlwdCAod2hpY2ggcnVucyBvdGhlciBzY3JpcHRzKQpzb3VyY2UoIi4vc2NyaXB0cy9fU0VUVVAuUiIpCgojIGxvYWQgaW4gRUZBcyAmIG5hbWVzIGZyb20gQ2hhcHRlciBJSUkKc291cmNlKCIuL3NjcmlwdHMvc3RvcmVkX2NoMDMuUiIpCmBgYAoKCiMgQ2hhcHRlciBvdmVydmlldwoKSW4gdGhpcyBjaGFwdGVyLCBJIGZvY3VzIG9uIHRoZSBzZWNvbmQgb2YgbXkgdGhyZWUga2V5IHF1ZXN0aW9ucyBhYm91dCB0aGUgZGV2ZWxvcG1lbnQgb2YgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlOiBfSG93IGFyZSB0aGUgY29uY2VwdHVhbCB1bml0cyB0aGF0IGFuY2hvciByZXByZXNlbnRhdGlvbnMgb2YgbWVudGFsIGxpZmUgb3JnYW5pemVkIGluIHJlbGF0aW9uIHRvIGVhY2ggb3RoZXIsIGFuZCBob3cgZG9lcyB0aGlzIG9yZ2FuaXphdGlvbiBjaGFuZ2Ugb3ZlciBkZXZlbG9wbWVudD9fIEFzIGluIENoYXB0ZXIgSUlJLCB0byBhZGRyZXNzIHRoaXMgcXVlc3Rpb24gSSBkcmF3IG9uIGRhdGEgZnJvbSBhbGwgb2YgdGhlIGN1cnJlbnQgc3R1ZGllcyAoU3R1ZGllcyAxLTQpOyBmb3IgZGV0YWlscyBhYm91dCB0aGUgbWV0aG9kcyBvZiB0aGVzZSBzdHVkaWVzLCBzZWUgQ2hhcHRlciBJSS4gVGhlIGdvYWwgb2YgdGhpcyBjaGFwdGVyIGlzIHRvIHByb3ZpZGUgInNuYXBzaG90cyIgb2YgdGhlIG9yZ2FuaXphdGlvbiBvZiBjb25jZXB0dWFsIHVuaXRzIGluIGVhcmx5IGNoaWxkaG9vZCwgbWlkZGxlIGNoaWxkaG9vZCwgYW5kIGFkdWx0aG9vZC4KCgojIEdlbmVyYWwgYW5hbHlzaXMgcGxhbgoKIyMgSGlnaC1sZXZlbCBvdmVydmlldwoKSW4gdGhpcyBjaGFwdGVyLCBJIGV4YW1pbmUgdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlICJjb25jZXB0dWFsIHVuaXRzIiBpZGVudGlmaWVkIGluIENoYXB0ZXIgSUlJLiBIb3cgZG9lcyBhIHBhcnRpY2lwYW50J3MgYXNzZXNzbWVudCBvZiBvbmUgY29uY2VwdHVhbCB1bml0IGZvciBhIHBhcnRpY3VsYXIgdGFyZ2V0IGNoYXJhY3RlciAoZS5nLiwgdGhlIGRlZ3JlZSB0byB3aGljaCBoZSBvciBzaGUgaW5kaWNhdGVzIHRoYXQgYSBiZWV0bGUgaXMgY2FwYWJsZSBvZiB0aGUgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIG9mIHRoZSBCT0RZKSBhZmZlY3QgdGhhdCBwYXJ0aWNpcGFudCdzIGFzc2Vzc21lbnRzIG9mIG90aGVyIGNvbmNlcHR1YWwgdW5pdHMgZm9yIHRoYXQgdGFyZ2V0IGNoYXJhY3RlciAoZS5nLiwgaGlzIG9yIGhlciBhc3Nlc3NtZW50IG9mIHRoZSBiZWV0bGUncyBjYXBhY2l0aWVzIGluIHRoZSBkb21haW5zIG9mIEhFQVJUIG9yIE1JTkQpPwoKSSBmb2N1cyBpbiBwYXJ0aWN1bGFyIG9uIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIGRvY3VtZW50ZWQgYnkgdGhlIHN0dWRpZXMgaW5jbHVkZWQgaW4gdGhpcyBkaXNzZXJ0YXRpb27igJRyZS1hbmFseXplZCBhcyBpbmRpY2F0b3JzIG9mIHRoZSBicm9hZGVyICJjb25jZXB0dWFsIHVuaXRzIiBpZGVudGlmaWVkIGluIENoYXB0ZXIgSUlJ4oCUbWlnaHQgc2hlZCBsaWdodCBvbiB0aGUgX2hpZXJhcmNoaWNhbCBvcmdhbml6YXRpb25fIG9mIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMsIGkuZS4sIHdoaWNoIGNvbmNlcHR1YWwgdW5pdHMgbWlnaHQgYmUgbW9yZSBiYXNpYyBvciBmdW5kYW1lbnRhbCB2cy4gbW9yZSBjb21wbGV4LCBhbmQgd2hldGhlciBhbnkgb2YgdGhlc2UgY29uY2VwdHVhbCB1bml0cyBtaWdodCBvciBtaWdodCBub3QgYmUgY29uc2lkZXJlZCB0byBkZXBlbmQgb24gdGhlIHByZXNlbmNlIG9mIG90aGVycy4gSW4gQ2hhcHRlciBJSSwgSSBpbGx1c3RyYXRlZCB0aGlzIHdpdGggdGhlIGZvbGxvd2luZyBleGFtcGxlOiBJZiBtYW55IHBhcnRpY2lwYW50cyBlbmRvcnNlIGNhcGFjaXRpZXMgYXNzb2NpYXRlZCB3aXRoIENvbmNlcHR1YWwgVW5pdCBBIHdpdGhvdXQgZW5kb3JzaW5nIGNhcGFjaXRpZXMgYXNzb2NpYXRlZCB3aXRoIENvbmNlcHR1YWwgVW5pdCBCLCBidXQgdmVyeSBmZXcgcGFydGljaXBhbnRzIGRvIHRoZSByZXZlcnNlIChlbmRvcnNpbmcgY2FwYWNpdGllcyBhc3NvY2lhdGVkIHdpdGggQ29uY2VwdHVhbCBVbml0IEIgYnV0IG5vdCBDb25jZXB0dWFsIFVuaXQgQSksIHRoaXMgcHJvdmlkZXMgc29tZSBldmlkZW5jZSB0aGF0IENvbmNlcHR1YWwgVW5pdCBBIGlzIG1vcmUgYmFzaWMgb3IgZnVuZGFtZW50YWwgdGhhbiBDb25jZXB0dWFsIFVuaXQgQiwgb3IgdGhhdCBDb25jZXB0dWFsIFVuaXQgQiBzb21laG93IGRlcGVuZHMgb24gKHBlcmhhcHMgcmVxdWlyZXMpIENvbmNlcHR1YWwgVW5pdCBBLiAKCkhlcmUgSSB3aWxsIHRyYW5zbGF0ZSB0aGlzIGdlbmVyYWwgaW50ZXJlc3QgaW4gdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgY29uY2VwdHVhbCB1bml0cywgYXMgd2VsbCBhcyB0aGUgc3BlY2lmaWMgaW50dWl0aW9uIGFib3V0IGhvdyB0byBkZXRlY3QgdGhlIGtpbmRzIG9mIGFzeW1tZXRyaWVzIHRoYXQgd291bGQgYmUgdGhlIHNpZ25hdHVyZSBvZiBoaWVyYXJjaGljYWwgcmVsYXRpb25zaGlwcywgaW50byBhIHNwZWNpZmljIGFuYWx5c2lzIHBsYW4gdG8gYmUgYXBwbGllZCB0byBlYWNoIG9mIHRoZXNlIGRhdGFzZXRzIGluIHR1cm4uIAoKIyMgRGV0YWlscyBvZiBhbmFseXNlcwoKVW5saWtlIHRoZSBwcmV2aW91cyBjaGFwdGVyLCBpbiB3aGljaCBJIGVtcGxveWVkIGEgY2Fub25pY2FsIGFwcHJvYWNoIHRvIGlkZW50aWZ5aW5nIGxhdGVudCBjb25zdHJ1Y3RzIHRocm91Z2ggYW5hbHlzZXMgb2YgY29ycmVsYXRpb24gc3RydWN0dXJlc+KAlGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNpcyAoRUZBKeKAlGluIHRoaXMgY2hhcHRlciB0aGVyZSBpcyBubyB0cmllZC1hbmQtdHJ1ZSBtZXRob2QgZm9yIG1lZXRpbmcgbXkgYW5hbHlzaXMgZ29hbHMuIEluc3RlYWQsIEkgY2hhcnQgbXkgb3duIGNvdXJzZSB0aHJvdWdoIHRoZXNlIGRhdGFzZXRzLCB1c2luZyB0aGUgRUZBIHNvbHV0aW9ucyByZXBvcnRlZCBpbiBDaGFwdGVyIElJIHRvIHNjb3JlIHBhcnRpY2lwYW50cycgZW5kb3JzZW1lbnRzIG9mIGVhY2ggY29uY2VwdHVhbCB1bml0IGZvciB0aGUgcGFydGljdWxhciB0YXJnZXQgY2hhcmFjdGVyKHMpIHRoYXQgdGhleSBhc3Nlc3NlZCwgZXhhbWluaW5nIGhvbGlzdGljIHZpc3VhbGl6YXRpb25zIG9mIHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIHRoZXNlIGVuZG9yc2VtZW50cywgYW5kIHRoZW4gY29uZHVjdGluZyBtb3JlIHRhcmdldGVkIHJlZ3Jlc3Npb24gYW5hbHlzZXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBjb25jZXB0dWFsIHVuaXRzIGFzIG9uZSBpbmRleCBvZiBhc3ltbWV0cmljYWwgKGFuZCBwb3NzaWJseSBoaWVyYXJjaGljYWwpIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBjb25jZXB0dWFsIHVuaXRzLgoKIyMjIFNjb3JpbmcgZW5kb3JzZW1lbnRzIG9mIGNvbmNlcHR1YWwgdW5pdHMKClRoZSBmaXJzdCBzdGVwIGluIHRoZXNlIGFuYWx5c2VzIGlzIHRvIHRyYW5zZm9ybSBwYXJ0aWNpcGFudHMnIHJhdGluZ3Mgb2YgaW5kaXZpZHVhbCBtZW50YWwgY2FwYWNpdGllcyBpbnRvICJzY29yZXMiIHRoYXQgaW5kaWNhdGUgdGhlIGV4dGVudCB0byB3aGljaCB0aGV5IGVuZG9yc2VkIGEgcGFydGljdWxhciBjb25jZXB0dWFsIHVuaXQgZm9yIHRoZSB0YXJnZXQgY2hhcmFjdGVyKHMpIHRoYXQgdGhleSB3ZXJlIGFzc2lnbmVkIHRvIGFzc2Vzcy4gVG8gZG8gdGhpcywgSSBtYWtlIHVzZSBvZiB0aGUgRUZBcyBwcmVzZW50ZWQgaW4gQ2hhcHRlciBJSUnigJR3aGljaCBvcmlnaW5hbGx5IHNlcnZlZCB0byBpZGVudGlmeSBhIHNldCBvZiBjb25jZXB0dWFsIHVuaXRzIGluIGEgcGFydGljdWxhciBzYW1wbGXigJR0byBhIG5ldyBlbmQ6IHRoZSBjb25zdHJ1Y3Rpb24gb2YgInNjYWxlcyIgZm9yIGVhY2ggb2YgdGhlc2UgY29uY2VwdHVhbCB1bml0cy4gU2NhbGUgY29uc3RydWN0aW9uIGlzIGEgY29tbW9uIHVzZSBvZiBFRkEgYW5kIHNpbWlsYXIgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIGFuYWx5c2VzIChpZiBhbnl0aGluZywgbW9yZSBjb21tb24gdGhhbiB1c2luZyBFRkEgdG8gbWFrZSB0aGUga2luZHMgb2YgdGhlb3JldGljYWwgYXJndW1lbnRzIGZlYXR1cmVkIGluIENoYXB0ZXIgSUkpLgoKRm9yIGVhY2ggRUZBIHNvbHV0aW9uLCBJIGNvbnN0cnVjdCBhIHNjYWxlIGZvciBlYWNoIG9mIHRoZSBmYWN0b3JzIChjb25jZXB0dWFsIHVuaXRzKSBpZGVudGlmaWVkIGJ5IHRoYXQgc29sdXRpb24uIEZpcnN0LCBJIHNvcnQgZWFjaCBvZiB0aGUgbWVudGFsIGNhcGFjaXRpZXMgaW5jbHVkZWQgaW4gdGhhdCBzdHVkeSBpbnRvIGNhdGVnb3JpZXMgYmFzZWQgb24gdGhlaXIgbG9hZGluZ3Mgb24gZWFjaCBvZiB0aGUgZmFjdG9ycyBpbiB0aGF0IHNvbHV0aW9uLiBGb3IgZWFjaCBtZW50YWwgY2FwYWNpdHksIEkgaWRlbnRpZnkgdGhlICJkb21pbmFudCIgZmFjdG9yIGFzIHRoZSBmYWN0b3Igd2l0aCB0aGUgbGFyZ2VzdCBwb3NpdGl2ZSBmYWN0b3IgbG9hZGluZy4gRm9yIGV4YW1wbGUsIGlmIHRoZSBtZW50YWwgY2FwYWNpdHkgX2ZlZWwgaGFwcHlfIGhhZCBsb2FkaW5ncyBvZiAwLjYwIG9uIHRoZSBCT0RZIGZhY3RvciwgMC43MCBvbiB0aGUgSEVBUlQgZmFjdG9yLCBhbmQgMC4zMCBvbiB0aGUgTUlORCBmYWN0b3IsIEkgd291bGQgc29ydCBpdCBpbnRvIHRoZSBIRUFSVCBjYXRlZ29yeS4gRm9yIGVhY2ggZmFjdG9yLCBJIHRha2UgdGhlIHNpeCBoaWdoZXN0LWxvYWRpbmcgaXRlbXMgYXMgYSBjYW5kaWRhdGUgc2NhbGUsIHRoZW4gImRyb3AiIHRoZSBjYXBhY2l0aWVzIHdpdGggdGhlIHNtYWxsZXN0IGZhY3RvciBsb2FkaW5ncyBvbiB0aGVpciByZXNwZWN0aXZlIGRvbWluYW50IGZhY3RvcnMgdW50aWwgSSBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBtZW50YWwgY2FwYWNpdGllcyBpbiBlYWNoIGNhdGVnb3J5LiBGb3IgZXhhbXBsZSwgaWYgdGhlIEJPRFkgZmFjdG9yIHdlcmUgdGhlIGRvbWluYW50IGZhY3RvciBmb3IgbmluZSBtZW50YWwgY2FwYWNpdGllcywgdGhlIEhFQVJUIGZhY3RvciBmb3Igc2l4IGNhcGFjaXRpZXMsIGFuZCB0aGUgTUlORCBmYWN0b3IgZm9yIGZpdmUgY2FwYWNpdGllcywgZm9yIGVhY2ggZmFjdG9yIEkgd291bGQga2VlcCBvbmx5IHRoZSBjYXBhY2l0aWVzIHdpdGggdGhlIGZpdmUgaGlnaGVzdCBwb3NpdGl2ZSBsb2FkaW5ncyBvbiB0aGF0IGZhY3RvciwgaW4gb3JkZXIgdG8gY29uc3RydWN0IHRocmVlIHNjYWxlcyBvZiBlcXVhbCBsZW5ndGggKGFuZCBhIG1heGltdW0gbGVuZ3RoIG9mIHNpeCBpdGVtcykuCgpUbyBjYWxjdWxhdGUgc2NvcmVzIG9uIHRoZXNlIHNjYWxlcywgSSB0YWtlIHRoZSBhdmVyYWdlIG9mIGFsbCBvZiBtZW50YWwgY2FwYWNpdGllcyBmb3IgZWFjaCBzY2FsZSwgcmVzY2FsaW5nIHNjb3JlcyB0byByYW5nZSBmcm9tIDAgdG8gMSB0byBmYWNpbGl0YXRlIGNvbXBhcmlzb24gYWNyb3NzIHN0dWRpZXMuIFRoaXMgeWllbGRzIGEgZGF0YXNldCBpbiB3aGljaCBlYWNoIHBhcnRpY2lwYW50IGlzIGFzc29jaWF0ZWQgd2l0aCBvbmUgc2NvcmUgKGJldHdlZW4gMCBhbmQgMSkgZm9yIGVhY2ggb2YgdGhlIGNvbmNlcHR1YWwgdW5pdHMgaWRlbnRpZmllZCBpbiB0aGUgcmVsYXRpdmUgRUZBIHNvbHV0aW9uLCBmb3IgZWFjaCBvZiB0aGUgdGFyZ2V0IGNoYXJhY3RlcnMgdGhhdCB0aGF0IHBhcnRpY2lwYW50IGFzc2Vzc2VkLgoKSW4gdGhpcyBjaGFwdGVyLCBJIGFwcGx5IHRoaXMgbWV0aG9kIHRvIGFsbCBvZiB0aGUgdGhyZWUtZmFjdG9yIHNvbHV0aW9ucyBmb3IgYWR1bHQgc2FtcGxlcyBhcyBwcmVzZW50ZWQgaW4gQ2hhcHRlciBJSUkgKFN0dWRpZXMgMS00KSwgeWllbGRpbmcgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjb3JlcyBmb3IgZWFjaCB0YXJnZXQgY2hhcmFjdGVyIGFzIGFzc2Vzc2VkIGJ5IGVhY2ggcGFydGljaXBhbnQuIChJIGlnbm9yZSB0aGUgYWJlcnJhbnQgZm91ci1mYWN0b3Igc29sdXRpb24gZm9yIGFkdWx0cyBpbiBTdHVkeSAyIHN1Z2dlc3RlZCBieSBvbmUgb2YgdGhlIHRocmVlIGZhY3RvciByZXRlbnRpb24gcHJvdG9jb2xzIGNvbnNpZGVyZWQgaW4gdGhhdCBjaGFwdGVyLCBzaW5jZSB0aGlzIHdhcyB0aGUgb25seSBzdHVkeSBvdXQgb2YgdGhlIHNldmVuIGNvbnNpZGVyZWQgaW4gd2hpY2ggYSBmb3VyLWZhY3RvciBzb2x1dGlvbiBhcHBlYXJlZCB0byBhZGQgYW55IHZhbHVlIGJleW9uZCB0aGUgcm9idXN0IEJPRFktSEVBUlQtTUlORCBmcmFtZXdvcmsgY29tbW9uIHRvIGFsbCBzdHVkaWVzLiBbWFggQVBQRU5ESVggQj9dKSAKCkkgdXNlIHRoZXNlIHRocmVlLWZhY3RvciBhZHVsdCBzb2x1dGlvbnMgdG8gYXNzZXNzIGRhdGFzZXRzIGZyb20gYm90aCBhZHVsdHMgYW5kIGNoaWxkcmVuLCBhbGxvd2luZyBtZSB0byBleHBsb3JlIHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIGEgIm1hdHVyZSIgc2V0IG9mIGNvbmNlcHR1YWwgdW5pdHMgKG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQsIG92ZXIgZGV2ZWxvcG1lbnQsIGNoaWxkcmVuIHdpbGwgdWx0aW1hdGVseSBjb21lIHRvIGEgY29uc2Vuc3VzIHdpdGggdGhlIGFkdWx0cyBpbiB0aGVpciBjdWx0dXJhbCBjb250ZXh0KS4KCkZvciB0aGUgZmlyc3Qgc2FtcGxlIG9mICJvbGRlciIgY2hpbGRyZW4gKDctOXkgb2YgYWdlLCBTdHVkeSAyKSwgSSBhbHNvIGJyaWVmbHkgY29uc2lkZXIgYSBzZWNvbmQgc2V0IG9mIGNvbmNlcHR1YWwgdW5pdHM6IEJPRFksIEhFQVJULCBhbmQgTUlORCBhcyBkZWZpbmVkIGJ5IEVGQXMgb2YgdGhlIGNoaWxkcmVuJ3Mgb3duIHJlc3BvbnNlcyAocmF0aGVyIHRoYW4gYWR1bHRzJyByZXNwb25zZXMpLiBCZWNhdXNlIHRoZSBFRkFzIGZvciBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzIGFyZSBzbyBzaW1pbGFyIChzZWUgQ2hhcHRlciBJSSBhbmQgVGFibGUgNC4xMCksIHRoZSBvdXRjb21lcyBvZiB0aGVzZSB0d28gYXBwcm9hY2hlcyB0byBjb25zdHJ1Y3RpbmcgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyB0byB5aWVsZCB2ZXJ5IHNpbWlsYXIgcmVzdWx0cyBpbiB0aGlzIGFnZSBncm91cC4gKEluZGVlZCwgZm9yIHRoZSBzZWNvbmQgc2FtcGxlIG9mICJvbGRlciIgY2hpbGRyZW4sIFN0dWR5IDMsIHRoZSBzY2FsZXMgdGhhdCB3b3VsZCBlbWVyZ2UgZnJvbSBFRkEgb2YgdGhlaXIgcmVzcG9uc2VzIGFyZSBpZGVudGljYWwgdG8gdGhlIHNjYWxlcyB0aGF0IGVtZXJnZSBmcm9tIEVGQSBvZiBhZHVsdCByZXNwb25zZXMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBhIHNpbmdsZSBpdGVtIG9uIHRoZSBfQk9EWV8gc2NhbGU7IHNlZSBUYWJsZSA0LjEwLikKCkZvciAieW91bmdlciIgY2hpbGRyZW4gKDQtNnkgb2YgYWdlLCBTdHVkeSAzOyA0LTV5IG9mIGFnZSwgU3R1ZHkgNCksIEkgaGF2ZSBjaG9zZW4gX25vdF8gdG8gZXhhbWluZSB0aGUgdmFyaW91cyBzZXRzIG9mIHR3byB0byBmb3VyIGNvbmNlcHR1YWwgdW5pdHMgdGhhdCB3b3VsZCBiZSBkZWZpbmVkIGJ5IEVGQXMgb2YgY2hpbGRyZW4ncyBvd24gcmVzcG9uc2VzLiAgQXMgZGlzY3Vzc2VlZCBhdCBsZW5ndGggaW4gQ2hhcHRlciBJSSwgRUZBcyBvZiB5b3VuZ2VyIGNoaWxkcmVuJ3MgcmVzcG9uc2VzIHdlcmUgbGVzcyByb2J1c3QgYW5kIHJlbGlhYmxlIHRoYW4gdGhvc2Ugb2Ygb2xkZXIgY2hpbGRyZW4gb3IgYWR1bHRzLCB3aXRoIGRpZmZlcmVudCBmYWN0b3IgcmV0ZW50aW9uIHByb3RvY29scyBnZW5lcmF0aW5nIGRpZmZlcmVudCBFRkEgc29sdXRpb25zLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSBjdXJyZW50IGNoYXB0ZXIsIHRoaXMgd291bGQgbWVhbiBhc3Nlc3NpbmcgbXVsdGlwbGUgYWRkaXRpb25hbCBzZXRzIG9mIGNvbmNlcHR1YWwgdW5pdHMgZm9yIGVhY2ggb2YgdGhlc2Ugc2FtcGxlcy4gSSBoYXZlIGNob3NlbiB0byBwcmlvcml0aXplIGNvbXBhcmFiaWxpdHkgYWNyb3NzIHNhbXBsZXMgYW5kIHN0dWRpZXMgb3ZlciBjb21wbGV0ZW5lc3MgaW4gdGhlIG1haW4gdGV4dCBvZiB0aGlzIGNoYXB0ZXI7IHRoZSBpbnRlcmVzdGVkIHJlYWRlciBjYW4gZmluZCB0aGVzZSBhbHRlcm5hdGl2ZSBhbmFseXNlcyBpbiBBcHBlbmRpeCBCIFtYWCBETyBJIFdBTlQgVE8gRE8gVEhJUz9dLiAKCkl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhpcyBpcyBmYXIgZnJvbSB0aGUgb25seSB3YXkgdG8gYXBwcm9hY2ggInNjb3JpbmciIHBhcnRpY2lwYW50cyBvbiB0aGVzZSBjb25jZXB0dWFsIHVuaXRzLiBGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZiBjb25zdHJ1Y3Rpbmcgc2NhbGVzIHRvIGNhcHR1cmUgZWFjaCBjb25jZXB0dWFsIHVuaXQsIEkgY291bGQgaGF2ZSBleGFtaW5lZCBmYWN0b3Igc2NvcmVz4oCUc3VtbWFyaWVzIG9mIGVhY2ggZmFjdG9yIChjb25jZXB0dWFsIHVuaXQpIGJhc2VkIG9uIGEgcGFydGljaXBhbnQncyByZXNwb25zZXMgdG8gYWxsIG1lbnRhbCBjYXBhY2l0aWVzIGFuZCB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGFsbCBtZW50YWwgY2FwYWNpdGllcyBhbmQgYWxsIGZhY3RvcnMgaW5jbHVkZWQgaW4gdGhhdCBFRkEgc29sdXRpb24uIEhvd2V2ZXIsIG11Y2ggbGlrZSBfel8tc2NvcmVzLCBmYWN0b3Igc2NvcmVzIGluZGljYXRlIHdoZXJlIGEgcGFydGljaXBhbnQgZmFsbHMgaW4gcmVsYXRpb24gdG8gb3RoZXIgcGFydGljaXBhbnRzIGluIHRoZSBzYW1wbGUsIGFuZCBkbyBub3QgcHJvdmlkZSB0aGUga2luZCBvZiBhYnNvbHV0ZSBzY29yZSB0aGF0IGlzIGtleSB0byBteSBnb2FsIGluIHRoaXMgY2hhcHRlciwgd2hpY2ggaXMgdG8gYW5hbHl6ZSByZWxhdGlvbnNoaXBzIGFtb25nIGZhY3RvcnMgaW4gdGVybXMgb2YgdGhlIGV4dGVudCB0byB3aGljaCBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBpbmRpY2F0ZWQgdGhhdCB0YXJnZXQgY2hhcmFjdGVycyAicG9zc2Vzc2VkIiB0aGUgY29uY2VwdHVhbCB1bml0cyBCT0RZLCBIRUFSVCwgYW5kIE1JTkQsIGFuZCB0byBjb21wYXJlIHRoZXNlIHNjb3JlcyBhY3Jvc3Mgc2FtcGxlcyBhbmQgc3R1ZGllcyAocmF0aGVyIHRoYW4gb25seSBhY3Jvc3MgcGFydGljaXBhbnRzIHdpdGhpbiBhIHNhbXBsZSkuIFtYWCBBUFBFTkRJWCBCP10KCkV2ZW4gd2l0aGluIHRoZSAic2NhbGUiIGFwcHJvYWNoIGRlc2NyaWJlZCBpbiB0aGlzIHNlY3Rpb24sIHRoZXJlIGFyZSBtYW55IHBhcmFtZXRlcnMgb2YgdGhpcyBhbmFseXNpcyB0aGF0IEkgY291bGQgaGF2ZSBzZXQgZGlmZmVyZW50bHkuIEZvciBleGFtcGxlLCBJIGNvdWxkIGhhdmUgY29uc2lkZXJlZCBhYnNvbHV0ZSBmYWN0b3IgbG9hZGluZ3MgcmF0aGVyIHRoYW4gcmF3IGZhY3RvciBsb2FkaW5ncywgd2hpY2ggd291bGQgYWxsb3cgZm9yIG1lbnRhbCBjYXBhY2l0aWVzIHRoYXQgbG9hZGVkIGVzcGVjaWFsbHkgc3Ryb25nbHkgX25lZ2F0aXZlbHlfIG9uIGEgcGFydGljdWxhciBmYWN0b3IgdG8gY29udHJpYnV0ZSAobmVnYXRpdmVseSkgdG8gc2NvcmVzIG9uIHRoYXQgY29uY2VwdHVhbCB1bml0OyBJIGNvdWxkIGhhdmUgb21pdHRlZCB0aGUgc3RlcCBvZiBtYWtpbmcgdGhlIHNjYWxlcyBmb3IgYWxsIGZhY3RvcnMgd2l0aGluIGEgc2luZ2xlIEVGQSBzb2x1dGlvbiBlcXVhbCBsZW5ndGg7IEkgY291bGQgaGF2ZSBjaG9zZW4gdG8gdXNlIG9ubHkgdGhlIHRvcCBmb3VyIG9yIGZpdmUgKHJhdGhlciB0aGFuIHNpeCkgbWVudGFsIGNhcGFjaXRpZXMgYWNyb3NzIGFsbCBFRkEgc29sdXRpb25zLCBvciB0byBzZXQgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiBpdGVtcyBpbiBhIHNjYWxlOyBvciBJIGNvdWxkIGhhdmUgaW1wbGVtZW50ZWQgYWJzb2x1dGUgdGhyZXNob2xkcyBmb3IgaG93IHN0cm9uZ2x5IGEgbWVudGFsIGNhcGFjaXR5IG11c3QgbG9hZCBvbiBhIGZhY3RvciBpbiBvcmRlciB0byBjb3VudCB0b3dhcmQgdGhlIHNjb3JlIGZvciB0aGF0IGNvbmNlcHR1YWwgdW5pdCwgb3IgYWJzb2x1dGUgbGltaXRzIG9uIHRoZSBkZWdyZWUgdG8gd2hpY2ggYSBtZW50YWwgY2FwYWNpdHkgY2FuICJjcm9zcy1sb2FkIiBvbiBub24tZG9taW5hbnQgZmFjdG9ycyBhbmQgc3RpbGwgY291bnQgdG93YXJkIHRoZSBzY29yZSBmb3IgYW55IG9uZSBjb25jZXB0dWFsIHVuaXQuIFtYWCBBUFBFTkRJWCBCP10gSG93ZXZlciwgdGhlc2Uga2luZHMgb2YgZGV0YWlscyBkaWZmZXIgcXVpdGUgZHJhbWF0aWNhbGx5IGFjcm9zcyBzdHVkaWVzIGFuZCBhZ2UgZ3JvdXBzLiBGb3IgZXhhbXBsZSwgaW4gc29tZSBzYW1wbGVzIHRoZXJlIGFyZSBubyBzdHJvbmcgbmVnYXRpdmUgZmFjdG9yIGxvYWRpbmdzLCBhbmQgaW4gb3RoZXJzIHRoZXJlIGFyZTsgaWYgSSBjb25zaWRlcmVkIGFic29sdXRlIGxvYWRpbmdzIHJhdGhlciB0aGFuIHJhdyBsb2FkaW5ncywgSSBjb3VsZCBlbmQgdXAgY29tcGFyaW5nIHNjb3JlcyBmcm9tIGEgImJpcG9sYXIiIHNjYWxlIGluIG9uZSBzYW1wbGUgdG8gc2NvcmVzIGZyb20gYSAidW5pcG9sYXIiIHNjYWxlIGluIGFub3RoZXIgc2FtcGxlLCBtYWtpbmcgdGhlIGNvbXBhcmlzb24gbW9yZSBkaWZmaWN1bHQgdG8gaW50ZXJwcmV0LiBMaWtld2lzZSwgc29tZSBFRkEgc29sdXRpb25zIHRlbmRlZCB0byBmZWF0dXJlIGdlbmVyYWxseSB3ZWFrZXIgZmFjdG9yIGxvYWRpbmdzIHRoYW4gb3RoZXJzOyBpZiBJIHdlcmUgdG8gaW1wb3NlIGFic29sdXRlIHRocmVzaG9sZHMgZm9yIHRoZSBzdHJlbmd0aCBvZiBmYWN0b3IgbG9hZGluZ3MsIEkgY291bGQgZW5kIHVwIGNvbXBhcmluZyBzY29yZXMgZnJvbSBzY2FsZXMgb2Ygd2lsZGx5IGRpZmZlcmVudCBsZW5ndGhzIGFjcm9zcyBzYW1wbGVzLiBJbiBteSB2aWV3LCB0aGUgYW5hbHlzaXMgZGVjaXNpb25zIG91dGxpbmVkIGFib3ZlIG1heGltaXplIGNvbXBhcmFiaWxpdHkgYWNyb3NzIHN0dWRpZXMgYW5kIGFnZSBncm91cHPigJR0aGUgcHJpbWFyeSBnb2FsIG9mIHRoaXMgY2hhcHRlci4gKE5vdGUsIGhvd2V2ZXIsIHRoYXQgaW4gdGhlIGFuYWx5c2lzIGNvZGUgZm9yIHRoaXMgY2hhcHRlciBJIGhhdmUgaW5jbHVkZWQgZWFzeSBzaG9ydCBjdXRzIGZvciB0aGUgaW50ZXJlc3RlZCByZWFkZXIgdG8gZXhwbG9yZSBkaWZmZXJlbnQgb3B0aW9ucyBmb3IgZWFjaCBvZiB0aGVzZSBwYXJhbWV0ZXJzLikKCmBgYHtyfQojIHNlZSAiLi9zY3JpcHRzL29yZ19wYXJhbS5SIiBmb3IgcGFyYW1ldGVyIHNldHRpbmcKYGBgCgojIyMgVmlzdWFsaXppbmcgcmVsYXRpb25zaGlwcwoKQWZ0ZXIgY29uc3RydWN0aW5nIHNjYWxlcyB0byBjYXB0dXJlIHBhcnRpY2lwYW50cycgZW5kb3JzZW1lbnQgb2YgZWFjaCBjb25jZXB0dWFsIHVuaXQsIG15IG5leHQgc3RlcCBpcyB0byBjaGFyYWN0ZXJpemUgdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgc2NvcmVzIG9uIHRoZXNlIHRocmVlIHNjYWxlcyAoX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfKS4gVGhpcyBpcyBhIHRydWx5IGV4cGxvcmF0b3J5IGVuZGVhdm9yOiBBdCB0aGUgb3V0c2V0IG9mIHRoaXMgd29yaywgSSBoYWQgbm8gc3Ryb25nIGh5cG90aGVzZXMgYWJvdXQgdGhlc2UgcmVsYXRpb25zaGlwcywgYW5kIG9ubHkgaGlnaC1sZXZlbCBpbnR1aXRpb25zIGFib3V0IHdoaWNoIGFzcGVjdHMgb2YgdGhlc2UgcmVsYXRpb25zaGlwcyB3b3VsZCBiZSBvZiBncmVhdGVzdCBpbnRlcmVzdCBpbiB1bmRlcnN0YW5kaW5nIHRoZSBjb25jZXB0dWFsIHJlcHJlc2VudGF0aW9ucyBvZiBpbnRlcmVzdC4gQWNjb3JkaW5nbHksIEkgYmVnaW4gZWFjaCBzZWN0aW9uIHdpdGggYSBob2xpc3RpYyB2aXN1YWxpemF0aW9uIG9mIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlIHRocmVlIHBhaXJzIG9mIGNvbmNlcHR1YWwgdW5pdHMsIHByZXNlbnRpbmcgc2NhdHRlcnBsb3RzIG9mIHBhcnRpY2lwYW50cycgc2NvcmVzIG9uIGVhY2ggcGFpciBvZiBzY2FsZXMgKF9CT0RZXyB2cy4gX0hFQVJUXywgX0JPRFlfIHZzLiBfTUlORF8sIGFuZCBfSEVBUlRfIHZzLiBfTUlORF8pIGFuZCBvZmZlcmluZyBpbmZvcm1hbCBkZXNjcmlwdGlvbnMgb2Ygd2hhdCBJIGNvbnNpZGVyIHRvIGJlIHRoZSBtb3N0IHN0cmlraW5nIGZlYXR1cmVzIG9mIHRoZXNlIHNjYXR0ZXJwbG90cy4gSW4gYWRkaXRpb24gdG8gbW90aXZhdGluZyBteSBzdWJzZXF1ZW50IGZvcm1hbCBhbmFseXNlcywgdGhlc2UgaW5mb3JtYWwgZGVzY3JpcHRpb25zIGFyZSBpbnRlbmRlZCB0byBndWlkZSBmdXR1cmUgcmVzZWFyY2ggdGFyZ2V0aW5nIGFkZGl0aW9uYWwgYXNwZWN0cyBvZiB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyBjb25jZXB0dWFsIHVuaXRzIHRoYXQgYXJlIG91dHNpZGUgb2YgdGhlIHNjb3BlIG9mIHRoZSBjdXJyZW50IGRpc3NlcnRhdGlvbi4KCiMjIyBGb3JtYWwgYW5hbHlzZXMgb2YgYXN5bW1ldHJpZXMKCkFzIEkgZGVzY3JpYmVkIGluIHRoZSB0aGVvcmV0aWNhbCBvdmVydmlldyBvZiB0aGlzIGRpc3NlcnRhdGlvbiAoQ2hhcHRlciBJIFtYWCBDSEVDSyBUSElTIElTIFRSVUVdKSBhbmQgdGhlIG9wZW5pbmcgb2YgdGhpcyBjaGFwdGVyLCBvbmUgYXNwZWN0IG9mIHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIGNvbmNlcHR1YWwgdW5pdHMgdGhhdCBpcyBvZiBwYXJ0aWN1bGFyIGludGVyZXN0IHRvIG1lIGlzIHRoZSBwb3NzaWJpbGl0eSBvZiBhc3ltbWV0cmllcyBpbiB0aGVzZSByZWxhdGlvbnNoaXBzLiBXZXJlIHBhcnRpY2lwYW50cyBtb3JlIGxpa2VseSB0byBhdHRyaWJ1dGUgQk9EWSB3aXRob3V0IEhFQVJULCBvciBIRUFSVCB3aXRob3V0IEJPRFk/IFdoYXQgYWJvdXQgQk9EWSB2cy4gTUlORCwgb3IgSEVBUlQgdnMuIE1JTkQ/IFN1Y2ggYXN5bW1ldHJpZXMgbWlnaHQgcmV2ZWFsIHdoaWNoIGNvbmNlcHR1YWwgdW5pdHMgYXJlIG1vcmUgYmFzaWMgb3IgZnVuZGFtZW50YWwsIHdoZXRoZXIgYW55IG9mIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMgbWlnaHQgYmUgY29uc2lkZXJlZCB0byBkZXBlbmQgb24gdGhlIHByZXNlbmNlIG9mIG90aGVyc+KAlGluIG90aGVyIHdvcmRzLCB3aGV0aGVyIGNvbmNlcHR1YWwgcmVwcmVzZW50YXRpb25zIChpbiBhbnkgcGFydGljdWxhciBzYW1wbGUpIG1pZ2h0IGJlIGNoYXJhY3Rlcml6ZWQgYnkgYSBoaWVyYXJjaGljYWwgc3RydWN0dXJlIGFtb25nIGNvbmNlcHR1YWwgdW5pdHMuIExpa2V3aXNlLCBhZ2UtcmVsYXRlZCBkaWZmZXJlbmNlcyBpbiB0aGUgZGlyZWN0aW9uIG9yIHN0cmVuZ3RoIG9mIHRoZXNlIGFzeW1tZXRyaWVzIG1pZ2h0IGhpbnQgYXQgZGV2ZWxvcG1lbnRhbCBjaGFuZ2VzIGluIHRoZXNlIGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmVzIG92ZXIgZWFybHkgYW5kIG1pZGRsZSBjaGlsZGhvb2QuCgpHdWlkZWQgYnkgdGhpcyB0aGVvcmV0aWNhbCBpbnRlcmVzdCwgdGhlIGxhc3Qgc3RlcCBpbiBteSBhbmFseXNlcyBpbiB0aGlzIGNoYXB0ZXIgaXMgdG8gZXhhbWluZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcy4gRm9yIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChlLmcuLCBCT0RZIHZzLiBIRUFSVCksIEkgY2FsY3VsYXRlIGEgc2ltcGxlIGRpZmZlcmVuY2UgYmV0d2VlbiBzY29yZXMgb24gdGhlc2UgdHdvIHNjYWxlcyAoaW4gdGhpcyBjYXNlLCBzdWJ0cmFjdGluZyBwYXJ0aWNpcGFudHMnIF9IRUFSVF8gc2NvcmVzIGZyb20gdGhlaXIgX0JPRFlfIHNjb3JlcykuIEluIHRoZSB2aXN1YWxpemF0aW9ucyBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sIHRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIHBlcnBlbmRpY3VsYXIgZGlzdGFuY2UgYmV0d2VlbiBhIHBhcnRpY3VsYXIgZGF0YXBvaW50IGFuZCB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCkuIChUaGUgZGlyZWN0aW9ucyBvZiB0aGVzZSBkaWZmZXJlbmNlIHNjb3JlcyB3ZXJlIGNob3NlbiBhcmJpdHJhcmlseTsgZS5nLiwgSSBjb3VsZCBoYXZlIGNob3NlbiB0byBzdWJ0cmFjdCBwYXJ0aWNpcGFudHMnIF9CT0RZXyBzY29yZXMgZnJvbSB0aGVpciBfSEVBUlRfIHNjb3Jlcy4pCgpIZXJlIEkgZGVzY3JpYmUgbXkgcHJpbmNpcGxlcyBmb3IgaW50ZXJwcmV0aW5nIHRoZXNlIGRpZmZlcmVuY2Ugc2NvcmVzLiBBIHN1bW1hcnkgb2YgdGhlc2UgZGlmZmVyZW5jZSBzY29yZXMgYWNyb3NzIGFsbCBzYW1wbGVzIGFuZCBzdHVkaWVzIGNhbiBiZSBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoaXMgY2hhcHRlciAoRmlndXJlIDQuMTAsIHBhbmVsIEEpLgoKSW4gbXkgdmlldywgZGlmZmVyZW5jZSBzY29yZXMgY2xvc2UgdG8gemVybyBwcm92aWRlIG5vIGV2aWRlbmNlIGZvciBvciBhZ2FpbnN0IGEgaGllcmFyY2hpY2FsIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvbmNlcHR1YWwgdW5pdHMuIFRoaXMgaXMgaWxsdXN0cmF0ZWQgbW9zdCBkcmFtYXRpY2FsbHkgYnkgdGhlIGZhY3QgdGhhdCBhIGRpZmZlcmVuY2Ugc2NvcmUgb2YgemVybyBjb3VsZCBvY2N1ciBpZiBhIHBhcnRpY2lwYW50IGF0dHJpYnV0ZXMgdmVyeSBsaXR0bGUgaW4gdGhlIHdheSBvZiBtZW50YWwgbGlmZSB0byBhIHBhcnRpY3VsYXIgdGFyZ2V0IGNoYXJhY3RlciAoZS5nLiwgYW4gaW5lcnQgb2JqZWN0KSBvciBpZiBhIHBhcnRpY2lwYW50IGF0dHJpYnV0ZXMgbWF4aW1hbCBtZW50YWwgbGlmZSB0byBhIHBhcnRpY3VsYXIgdGFyZ2V0IGNoYXJhY3RlciAoZS5nLiwgYW4gYWR1bHQgaHVtYW4p4oCUaW4gZWl0aGVyIGNhc2UsIHRoaXMgd291bGQgeWllbGQgZGlmZmVyZW5jZSBzY29yZXMgb2YgemVybyBmb3IgYW55IHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cy4gRXZlbiBpZiBhIHBhcnRpY2lwYW50IGVuZG9yc2VzIHR3byBjb25jZXB0dWFsIHVuaXRzIHRvIGEgbWlkZGxpbmcgZGVncmVlIChlLmcuLCBpbmRpY2F0aW5nIHRoYXQgYSBiZWV0bGUgaGFzIG1pZGRsaW5nIGNhcGFjaXRpZXMgaW4gYm90aCB0aGUgX0JPRFlfIGFuZCBfTUlORF8gZG9tYWlucyksIEkgd291bGQgbm90IGNvbnNpZGVyIHRoaXMgZXZpZGVuY2UgYWdhaW5zdCBhIHBvc3NpYmxlIGhpZXJhcmNoaWNhbCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgY29uY2VwdHVhbCB1bml0cyBpbiBxdWVzdGlvbi4KCk1lYW53aGlsZSwgaWYgcGFydGljaXBhbnRzIHdpdGhpbiBhIHNhbXBsZSBoYXZlIHJhZGljYWxseSBkaXZlcmdlbnQgZGlmZmVyZW5jZSBzY29yZXPigJRlLmcuLCBpZiByb3VnaGx5IGhhbGYgb2YgcGFydGljaXBhbnRzIGhhdmUgbXVjaCBoaWdoZXIgX0hFQVJUXyB0aGFuIF9NSU5EXyBzY29yZXMgYW5kIHJvdWdobHkgaGFsZiBoYXZlIG11Y2ggbG93ZXIgX0hFQVJUXyB0aGFuIF9NSU5EXyBzY29yZXPigJRJIGludGVycHJldCB0aGlzIGFzIHNvbWUgZXZpZGVuY2UgX2FnYWluc3RfIHN5c3RlbWF0aWMgaGllcmFyY2hpY2FsIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgY29uY2VwdHVhbCB1bml0cyBpbiBxdWVzdGlvbi4gCgpJdCBpcyBvbmx5IGFuIGFidW5kYW5jZSBvZiBub24temVybyBkaWZmZXJlbmNlIHNjb3JlcyBydW5uaW5nIGluIHRoZSBzYW1lIGRpcmVjdGlvbiBmb3IgbWFueSBwYXJ0aWNpcGFudHMgd2l0aGluIGEgc2FtcGxlIHRoYXQsIGluIG15IHZpZXcsIHByb3ZpZGVzIGV2aWRlbmNlIF9mb3JfIHN5c3RlbWF0aWMgaGllcmFyY2hpZXMgYW1vbmcgdGhlIGNvbmNlcHR1YWwgdW5pdHMuIFRoaXMgZGVncmVlIG9mIGNvbnNlbnN1cyBhY3Jvc3MgcGFydGljaXBhbnRzIGluIHRoZSBkaXJlY3Rpb24gb2YgYXN5bW1ldHJ5IGJldHdlZW4gZW5kb3JzZW1lbnRzIG9mIHR3byBjb25jZXB0dWFsIHVuaXRzIGlzIHBhcnRpY3VsYXJseSBzaWduaWZpY2FudCBpbiB0aGVzZSBkYXRhc2V0cyBiZWNhdXNlIHRoZXNlIHN0dWRpZXMgd2VyZSBkZXNpZ25lZCB3aXRoIHRoZSBleHByZXNzIHB1cnBvc2Ugb2YgZWxpY2l0aW5nIF92YXJpYWJpbGl0eV8gaW4gbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBhY3Jvc3MgcGFydGljaXBhbnRz4oCUZWl0aGVyIGJ5IGFza2luZyBwYXJ0aWNpcGFudHMgYWJvdXQgImVkZ2UgY2FzZXMiIChhIGJlZXRsZSwgYSByb2JvdCksIHdob3NlIHBhcnRpY3VsYXIgbWVudGFsIGNhcGFjaXR5IHByb2ZpbGVzIGFyZSBsaWtlbHkgdG8gYmUgdGhlIHN1YmplY3Qgb2YgZGlzYWdyZWVtZW50IGFjcm9zcyBpbmRpdmlkdWFsczsgb3IgYnkgYXNraW5nIGRpZmZlcmVudCBwYXJ0aWNpcGFudHMgdG8gY29uc2lkZXIgYSB2YXJpZXR5IG9mICJkaXZlcnNlIGNoYXJhY3RlcnMiIChpbmNsdWRpbmcgaW5lcnQgb2JqZWN0cywgdGVjaG5vbG9naWVzLCBhbmQgYSB3aWRlIHJhbmdlIG9mIGFuaW1hbHMgYW5kIGh1bWFucyksIHdob3NlIG1lbnRhbCBjYXBhY2l0eSBwcm9maWxlcyBhcmUgbGlrZWx5IGNvbnNpZGVyZWQgdG8gdmFyeSBkcmFtYXRpY2FsbHkuIChTZWUgQ2hhcHRlciBJSSBmb3IgZnVydGhlciBkaXNjdXNzaW9uIG9mIHRoZXNlIHR3byB2YXJpYW50cyBvZiB0aGUgZXhwZXJpbWVudGFsIGFwcHJvYWNoLikgRGlmZmVyZW5jZXMgaW4gaW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMnIGtub3dsZWRnZSwgZXhwZXJpZW5jZSwgYW5kIG9waW5pb25zLCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIHRhcmdldCBjaGFyYWN0ZXJzIGFzc2Vzc2VkIGJ5IGRpZmZlcmVudCBwYXJ0aWNpcGFudHMsIHdlcmUga2V5IGZlYXR1cmVzIG9mIHRoZSBkZXNpZ24gb2YgdGhlc2Ugc3R1ZGllczsgaXQgd2FzIGNyaXRpY2FsIHRvIHRoZSBzdWNjZXNzIG9mIHRoZSBFRkFzIHByZXNlbnRlZCBpbiBDaGFwdGVyIElJSSB0aGF0IHBhcnRpY2lwYW50cyB2YXJpZWQgaW4gdGhlIGRlZ3JlZSB0byB3aGljaCB0aGV5IGVuZG9yc2VkIHBhcnRpY3VsYXIgbWVudGFsIGNhcGFjaXRpZXMuIElmLCBkZXNwaXRlIHRoaXMgdmFyaWFiaWxpdHksIHBhcnRpY2lwYW50cyBub25ldGhlbGVzcyBjb252ZXJnZSBvbiBhIHNhbWUgcGF0dGVybiBvZiBfcmVsYXRpdmVfIGVuZG9yc2VtZW50cyBhY3Jvc3MgdHdvIGNvbmNlcHR1YWwgdW5pdHPigJRlLmcuLCBpZiBtb3N0IHBhcnRpY2lwYW50cyBlbmRvcnNlIGNhcGFjaXRpZXMgaW5jbHVkZWQgaW4gdGhlIF9NSU5EXyBzY2FsZSBtb3JlIHN0cm9uZ2x5IHRoYW4gdGhleSBlbmRvcnNlIGNhcGFjaXRpZXMgaW5jbHVkZWQgaW4gdGhlIF9IRUFSVF8gc2NhbGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFic29sdXRlIHN0cmVuZ3RoIG9mIHRoZXNlIGVuZG9yc2VtZW50c+KAlHRoaXMgcHJvdmlkZXMgc29tZSBldmlkZW5jZSBvZiBhIGNvbW1vbiBjb25jZXB0dWFsIGZyYW1ld29yayB0aGF0IHBsYWNlcyB0aGVzZSBjb25jZXB0dWFsIHVuaXRzIGluIGFzeW1tZXRyaWNhbCwgcGVyaGFwcyBoaWVyYXJjaGljYWwsIHJlbGF0aW9uIHRvIG9uZSBhbm90aGVyLiAKClRvIG9wZXJhdGlvbmFsaXplIHRoZXNlIHByaW5jaXBsZXMgYW5kIHRlc3QgZm9yIGNvbnNlbnN1cyBpbiB0aGUgZGlyZWN0aW9uIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gYW55IHR3byBjb25jZXB0dWFsIHVuaXRzLCBJIGNvbXBhcmUgZGlmZmVyZW5jZSBzY29yZXMgdG8gemVybyB2aWEgQmF5ZXNpYW4gcmVncmVzc2lvbnMsIHVzaW5nIHRoZSAiYnJtcyIgcGFja2FnZSBmb3IgUiBbWFggQ0lURV0uIEkgY29uZHVjdCBhIHNlcGFyYXRlIHJlZ3Jlc3Npb24gYW5hbHlzaXMgZm9yIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzLCBhY2NvdW50aW5nIGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzIChlZmZlY3QtY29kZWQgc28gYXMgdG8gY2VudGVyIHRoZSBpbnRlcmNlcHQgYXQgdGhlIGdyYW5kIG1lYW4pIGFuZCBhY2NvdW50aW5nIGZvciB3aXRoaW4tc3ViamVjdHMgZGVzaWducyB3aGVuIGFwcHJvcHJpYXRlIChpLmUuLCBmb3IgU3R1ZHkgMWMgYW5kIFN0dWR5IDQpIGJ5IGluY2x1ZGluZyBtYXhpbWFsIHJhbmRvbSBlZmZlY3RzIHN0cnVjdHVyZXMgKHJhbmRvbSBpbnRlcmNlcHRzIGZvciBwYXJ0aWNpcGFudHMpLiBJbiB0aGVzZSBhbmFseXNlcywgSSBhbSBwcmltYXJpbHkgaW50ZXJlc3RlZCBpbiB3aGV0aGVyIHRoZSBpbnRlcmNlcHQgaXMgZXN0aW1hdGVkIHRvIGJlIGRpZmZlcmVudGlhYmxlIGZyb20gemVybywgd2hpY2ggSSBnYXVnZSBieSBhc3Nlc3Npbmcgd2hldGhlciB0aGUgOTUlIGNyZWRpYmxlIGludGVydmFsIGZvciB0aGUgaW50ZXJjZXB0IGNvbnRhaW5zIHplcm8uIAoKSSBjb25kdWN0IG1hbnkgc3VjaCByZWdyZXNzaW9ucyBpbiB0aGlzIGNoYXB0ZXI6IE9uZSBmb3IgZWFjaCBvZiB0aGUgdGhyZWUgcGFpcnMgb2YgY29uY2VwdHVhbCB1bml0cyAoX0JPRFkgLSBIRUFSVF8sIF9CT0RZIC0gTUlORF8sIGFuZCBfSEVBUlQgLSBNSU5EXyksIGZvciBlYWNoIGFnZSBncm91cCwgZm9yIGVhY2ggc2FtcGxlLiBBIHN1bW1hcnkgb2YgdGhlc2UgaW50ZXJjZXB0cyBhY3Jvc3MgYWxsIHNhbXBsZXMgYW5kIHN0dWRpZXMgY2FuIGJlIGZvdW5kIGF0IHRoZSBlbmQgb2YgdGhpcyBjaGFwdGVyIChGaWd1cmUgNC4xMCwgcGFuZWwgQikuIEluIGFkZGl0aW9uLCBmb3Igc3R1ZGllcyB0aGF0IGluY2x1ZGUgYSBkZXZlbG9wbWVudGFsIGNvbXBhcmlzb24gKFN0dWRpZXMgMi00KSwgSSBjb25kdWN0IGFuIGFkZGl0aW9uYWwgYW5hbHlzaXMgZm9yIGVhY2ggb2YgdGhlIHRocmVlIHBhaXJzIG9mIGNvbmNlcHR1YWwgdW5pdHMsIGluY2x1ZGluZyBtYWluIGVmZmVjdHMgYW5kIGludGVyYWN0aW9ucyB0byBjb21wYXJlIHRoZSBhZ2UgZ3JvdXBzIGluY2x1ZGVkIChkdW1teS1jb2RlZCB3aXRoIGFkdWx0cyBhcyB0aGUgYmFzZWxpbmUpOyB0aGVzZSBhbmFseXNlcyBwcm92aWRlIGZvcm1hbCBhc3Nlc3NtZW50cyBvZiB0aGUgZGVncmVlIHRvIHdoaWNoIGNoaWxkcmVuIGRpZmZlciBmcm9tIGFkdWx0cyBpbiB0aGUgYXN5bW1ldHJ5IG9mIHRoZWlyIHJlc3BvbnNlcyB0byB0aGVzZSBjb25jZXB0dWFsIHVuaXRzLiBJIGRvIG5vdCBpbXBsZW1lbnQgYW55ICJjb3JyZWN0aW9ucyIgZm9yIG11bHRpcGxlIGNvbXBhcmlzb25zLCBpbiBwYXJ0IGJlY2F1c2UgbXkgZXZhbHVhdGlvbnMgb2YgdGhlc2UgYW5hbHlzZXMgYXJlIGJhc2VkIG9uIGNyZWRpYmxlIGludGVydmFscyByYXRoZXIgdGhhbiBfcF8tdmFsdWVzIG9yIG90aGVyIGZyZXF1ZW50aXN0IGluZGljZXMgb2Ygc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlLiBQYXJhbWV0ZXIgZXN0aW1hdGVzIChfYl8pIGNhbiBiZSB1c2VkIGFzIGluZGljZXMgb2YgZWZmZWN0IHNpemUuCgoKIyBTdHVkeSAxOiBBbiBhZHVsdCBlbmRwb2ludAoKSW4gdGhlIGNvbnRleHQgb2YgdGhpcyBkaXNzZXJ0YXRpb24sIFN0dWR5IDEgc2VydmVzIHRvIGRlc2NyaWJlIGEgZGV2ZWxvcG1lbnRhbCBlbmRwb2ludCBmb3IgY29uY2VwdHVhbCByZXByZXNlbnRhdGlvbnMgb2YgbWVudGFsIGxpZmUuIEluIHRoaXMgY2hhcHRlciwgSSBmb2N1cyBvbiB3aGF0IHRoaXMgc3R1ZHkgY2FuIHJldmVhbCBhYm91dCB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgY29uY2VwdHVhbCB1bml0cyBkaXNjdXNzZWQgaW4gQ2hhcHRlciBJSUkuIFRoZXNlIGFuYWx5c2VzIHdlcmUgbm90IGluY2x1ZGVkIGluIHRoZSBvcmlnaW5hbCBwdWJsaWNhdGlvbiBvZiB0aGlzIHdvcmsgKFdlaXNtYW4gZXQgYWwuLCAyMDE3KS4KClN0dWRpZXMgMWEtMWMgZW1wbG95ZWQgdGhlICJlZGdlIGNhc2UiIHZhcmlhbnQgb2YgdGhlIGdlbmVyYWwgYXBwcm9hY2gsIHdpdGggcGFydGljaXBhbnRzIGFzc2Vzc2luZyB0aGUgbWVudGFsIGNhcGFjaXRpZXMgb2YgYSBiZWV0bGUsIGEgcm9ib3QsIG9yIGJvdGguIFN0dWRpZXMgMWEgYW5kIDFiIHdlcmUgaWRlbnRpY2FsOiBVUyBhZHVsdHMgKFN0dWR5IDFhOiBfbl89YHIgbnJvdyhkMWFfYWRfd2lkZSlgOyBTdHVkeSAxYjogX25fPWByIG5yb3coZDFiX2FkX3dpZGUpYCkgZWFjaCBhc3Nlc3NlZCBhIHNpbmdsZSB0YXJnZXQgY2hhcmFjdGVyIG9uIDQwIG1lbnRhbCBjYXBhY2l0aWVzLiBTdHVkeSAxYyBlbXBsb3llZCB2ZXJ5IHNpbWlsYXIgbWV0aG9kcywgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgcGFydGljaXBhbnRzIChfbl89YHIgbnJvdyhkMWNfYWRfd2lkZSkvMmApIGVhY2ggYXNzZXNzZWQgX2JvdGhfIHRhcmdldCBjaGFyYWN0ZXJzIHNpZGUgYnkgc2lkZSAod2l0aCBsZWZ0LXJpZ2h0IHBvc2l0aW9uIGNvdW50ZXJiYWxhbmNlZCBhY3Jvc3MgcGFydGljaXBhbnRzKS4gQmVjYXVzZSB0aGVzZSBzdHVkaWVzIHdlcmUgc28gc2ltaWxhciwgaW4gdGhpcyBjaGFwdGVyLCBJIHdpbGwgZGlzY3VzcyB0aGVtIGluIHRhbmRlbS4KClN0dWR5IDFkIGVtcGxveWVkIHRoZSAiZGl2ZXJzZSBjaGFyYWN0ZXJzIiB2YXJpYW50IG9mIHRoZSBnZW5lcmFsIGFwcHJvYWNoLCBpbiB3aGljaCBgciBucm93KGQxZF9hZF93aWRlKWAgVVMgYWR1bHRzIHdlcmUgcmFuZG9tbHkgYXNzaWduZWQgdG8gYXNzZXNzIHRoZSBzYW1lIHNldCBvZiA0MCBtZW50YWwgY2FwYWNpdGllcyB1c2VkIGluIFN0dWRpZXMgMWEtMWQgZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIDIxIHRhcmdldCBjaGFyYWN0ZXJzOiBhbiBhZHVsdCwgYSBjaGlsZCwgYW4gaW5mYW50LCBhIHBlcnNvbiBpbiBhIHBlcnNpc3RlbnQgdmVnZXRhdGl2ZSBzdGF0ZSwgYSBmZXR1cywgYSBjaGltcGFuemVlLCBhbiBlbGVwaGFudCwgYSBkb2xwaGluLCBhIGJlYXIsIGEgZG9nLCBhIGdvYXQsIGEgbW91c2UsIGEgZnJvZywgYSBibHVlIGpheSwgYSBmaXNoLCBhIGJlZXRsZSwgYSBtaWNyb2JlLCBhIHJvYm90LCBhIGNvbXB1dGVyLCBhIGNhciwgb3IgYSBzdGFwbGVyLiAoU2VlIENoYXB0ZXIgSUkgYW5kIFdlaXNtYW4gZXQgYWwuLCAyMDE3LCBmb3IgZGV0YWlsZWQgbWV0aG9kcy4pCgojIyBSZXN1bHRzCgojIyMgU3R1ZGllcyAxYS0xYwoKIyMjIyBTY2FsZSBjb25zdHJ1Y3Rpb24KCmBgYHtyfQpzY2FsZXNfZWZhX3dkbV9kMWFfYWQgPC0gc2NhbGVfZnVuKGVmYV93ZG1fZDFhX2FkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfZWZhX3dkbV9kMWFfYWQpCmQxYV9hZF9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQxYV9hZCwgc2NhbGVzX2VmYV93ZG1fZDFhX2FkKQoKc2F2ZVJEUyhzY2FsZXNfZWZhX3dkbV9kMWFfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NhbGVzL3NjYWxlc19lZmFfd2RtX2QxYV9hZCIpCnNhdmVSRFMoZDFhX2FkX3Njb3JlZF9hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY29yZWRfZGF0YS9kMWFfYWRfc2NvcmVkX2FkIikKYGBgCgpgYGB7cn0Kc2NhbGVzX2VmYV93ZG1fZDFiX2FkIDwtIHNjYWxlX2Z1bihlZmFfd2RtX2QxYl9hZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2VmYV93ZG1fZDFiX2FkKQpkMWJfYWRfc2NvcmVkX2FkIDwtIHNjb3JlX2Z1bihkMWJfYWQsIHNjYWxlc19lZmFfd2RtX2QxYl9hZCkKCnNhdmVSRFMoc2NhbGVzX2VmYV93ZG1fZDFiX2FkLCBmaWxlID0gIi4vc3RvcmVkL3NjYWxlcy9zY2FsZXNfZWZhX3dkbV9kMWJfYWQiKQpzYXZlUkRTKGQxYl9hZF9zY29yZWRfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NvcmVkX2RhdGEvZDFiX2FkX3Njb3JlZF9hZCIpCmBgYAoKYGBge3J9CnNjYWxlc19lZmFfd2RtX2QxY19hZCA8LSBzY2FsZV9mdW4oZWZhX3dkbV9kMWNfYWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxY19hZCkKZDFjX2FkX3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDFjX2FkLCBzY2FsZXNfZWZhX3dkbV9kMWNfYWQpCgpzYXZlUkRTKHNjYWxlc19lZmFfd2RtX2QxY19hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY2FsZXMvc2NhbGVzX2VmYV93ZG1fZDFjX2FkIikKc2F2ZVJEUyhkMWNfYWRfc2NvcmVkX2FkLCBmaWxlID0gIi4vc3RvcmVkL3Njb3JlZF9kYXRhL2QxY19hZF9zY29yZWRfYWQiKQpgYGAKCmBgYHtyfQpzY2FsZXNfZWZhX3dkbV9kMWRfYWQgPC0gc2NhbGVfZnVuKGVmYV93ZG1fZDFkX2FkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfZWZhX3dkbV9kMWRfYWQpCmQxZF9hZF9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQxZF9hZCwgc2NhbGVzX2VmYV93ZG1fZDFkX2FkKQoKc2F2ZVJEUyhzY2FsZXNfZWZhX3dkbV9kMWRfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NhbGVzL3NjYWxlc19lZmFfd2RtX2QxZF9hZCIpCnNhdmVSRFMoZDFkX2FkX3Njb3JlZF9hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY29yZWRfZGF0YS9kMWRfYWRfc2NvcmVkX2FkIikKYGBgCgpgYGB7cn0KZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3dkbV9kMWFfYWQpCmZhY3RfbmFtZV9mdW4oZmFjdG9yX25hbWVzX2VmYV93ZG1fZDFiX2FkKQpmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxY19hZCkKCnNjYWxlc19lZmFfd2RtX2QxYV9hZCAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKCkKc2NhbGVzX2VmYV93ZG1fZDFiX2FkICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKQpzY2FsZXNfZWZhX3dkbV9kMWNfYWQgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpCmBgYAoKRm9yIGVhY2ggb2YgdGhlc2UgdGhyZWUgc3R1ZGllcywgZm9sbG93aW5nIHRoZSBzdGVwcyBkZXNjcmliZWQgaW4gdGhlICJHZW5lcmFsIGFuYWx5c2lzIHBsYW4sIiBhYm92ZSwgeWllbGRlZCBgciBmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxYV9hZClgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3dkbV9kMWFfYWQgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpYCBpdGVtcyBlYWNoLCB3aXRoIGEgbGFyZ2UgZGVncmVlIG9mIG92ZXJsYXAgaW4gaXRlbXMgYWNyb3NzIHN0dWRpZXM7IHNlZSBUYWJsZSA0LjEuCgpgYGB7cn0Kc2NhbGVzX3N0dWR5MSA8LSBiaW5kX3Jvd3Moc2NhbGVzX2VmYV93ZG1fZDFhX2FkICU+JSBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgMWEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzX2VmYV93ZG1fZDFiX2FkICU+JSBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgMWIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzX2VmYV93ZG1fZDFjX2FkICU+JSBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgMWMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzX2VmYV93ZG1fZDFkX2FkICU+JSBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgMWQiKSkgJT4lCiAgc2VsZWN0KC1jKGxvYWRpbmcsIG9yZGVyKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBzcHJlYWQoc3R1ZHksIGZhY3RvcikgJT4lCiAgbXV0YXRlKHVyX2ZhY3RvciA9IGlmZWxzZSghaXMubmEoYFN0dWR5IDFhYCksIGBTdHVkeSAxYWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoIWlzLm5hKGBTdHVkeSAxYmApLCBgU3R1ZHkgMWJgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSghaXMubmEoYFN0dWR5IDFjYCksIGBTdHVkeSAxY2AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBTdHVkeSAxZGApKSkpICU+JQogIGxlZnRfam9pbihzY2FsZXNfZWZhX3dkbV9kMWFfYWQgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXIxYSA9IG9yZGVyKSkgJT4lCiAgbGVmdF9qb2luKHNjYWxlc19lZmFfd2RtX2QxYl9hZCAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBvcmRlcikgJT4lIHJlbmFtZShvcmRlcjFiID0gb3JkZXIpKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDFjX2FkICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKSAlPiUgcmVuYW1lKG9yZGVyMWMgPSBvcmRlcikpICU+JQogIGxlZnRfam9pbihzY2FsZXNfZWZhX3dkbV9kMWRfYWQgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXIxZCA9IG9yZGVyKSkgJT4lCiAgYXJyYW5nZSh1cl9mYWN0b3IsIG9yZGVyMWEsIG9yZGVyMWIsIG9yZGVyMWMsIG9yZGVyMWQpICU+JQogIHNlbGVjdCgtYyh1cl9mYWN0b3IsIHN0YXJ0c193aXRoKCJvcmRlciIpKSkKYGBgCgpgYGB7cn0KdGFibGU0LjEgPC0gc2NhbGVzX3N0dWR5MSAlPiUKICBtdXRhdGVfYXQodmFycygtY2FwYWNpdHkpLAogICAgICAgICAgICBmdW5zKGlmZWxzZShpcy5uYSguKSwgIiIsICLinJMiKSkpICU+JQogIHJlbmFtZShDYXBhY2l0eSA9IGNhcGFjaXR5KSAlPiUKICBrYWJsZShmb3JtYXQgPSAiaHRtbCIsIAogICAgICAgIGNhcHRpb24gPSAiVGFibGUgNC4xOiBTY2FsZXMgZm9yIGVhY2ggb2YgdGhlIGNvbmNlcHR1YWwgdW5pdHMgKGZhY3RvcnMpIGlkZW50aWZpZWQgYnkgRUZBIGZvciBVUyBBZHVsdHMgaW4gU3R1ZGllcyAxYS0xZCAoc2VlIENoYXB0ZXIgSUlJKS4gQSBjaGVja21hcmsgaW5kaWNhdGVzIHRoYXQgYSBtZW50YWwgY2FwYWNpdHkgd2FzIGluY2x1ZGVkIGluIGEgc2NhbGUgZm9yIGEgcGFydGljdWxhciBzdHVkeS4iKSAlPiUgIAogIGthYmxlX3N0eWxpbmcoKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIHNjYWxlIiwgMSwgOSkgJT4lCiAgZ3JvdXBfcm93cygiSEVBUlQgc2NhbGUiLCAxMCwgMTcpICU+JQogIGdyb3VwX3Jvd3MoIk1JTkQgc2NhbGUiLCAxOCwgMjYpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQp0YWJsZTQuMQpgYGAKCiMjIyMgVmlzdWFsaXphdGlvbgoKYGBge3J9CnBsb3RzX2QxYV9hZF9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkMWFfYWRfc2NvcmVkX2FkKQpgYGAKCmBgYHtyfQpmaWdfZDFhX2FkX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kMWFfYWRfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMWFfYWRfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMWFfYWRfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBMSIsICJBMiIsICJBMyIpLCBuY29sID0gMykKCmZpZ19kMWFfYWRfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDFhX2FkX3Njb3JlZF9hZFtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpKQoKZmlnX2QxYV9hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kMWFfYWRfcGxvdHMsIGZpZ19kMWFfYWRfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kMWFfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAxYTogQWR1bHRzIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kMWFfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDFhX2FkX3RpdGxlLCBmaWdfZDFhX2FkX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3J9CnBsb3RzX2QxYl9hZF9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkMWJfYWRfc2NvcmVkX2FkKQpgYGAKCmBgYHtyfQpmaWdfZDFiX2FkX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kMWJfYWRfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMWJfYWRfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMWJfYWRfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCMSIsICJCMiIsICJCMyIpLCBuY29sID0gMykKCmZpZ19kMWJfYWRfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDFiX2FkX3Njb3JlZF9hZFtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpKQoKZmlnX2QxYl9hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kMWJfYWRfcGxvdHMsIGZpZ19kMWJfYWRfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kMWJfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAxYjogQWR1bHRzIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kMWJfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDFiX2FkX3RpdGxlLCBmaWdfZDFiX2FkX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3J9CnBsb3RzX2QxY19hZF9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkMWNfYWRfc2NvcmVkX2FkKQpgYGAKCmBgYHtyfQpmaWdfZDFjX2FkX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kMWNfYWRfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMWNfYWRfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMWNfYWRfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDMSIsICJDMiIsICJDMyIpLCBuY29sID0gMykKCmZpZ19kMWNfYWRfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDFjX2FkX3Njb3JlZF9hZFtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpKQoKZmlnX2QxY19hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kMWNfYWRfcGxvdHMsIGZpZ19kMWNfYWRfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kMWNfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAxYzogQWR1bHRzIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kMWNfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDFjX2FkX3RpdGxlLCBmaWdfZDFjX2FkX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3J9CnBsb3RzX2QxZF9hZF9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkMWRfYWRfc2NvcmVkX2FkLCBjb2xvcnMgPSBjb2xvcnMyMSkKYGBgCgpgYGB7cn0KZmlnX2QxZF9hZF9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDFkX2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDFkX2FkX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDFkX2FkX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRDEiLCAiRDIiLCAiRDMiKSwgbmNvbCA9IDMpCgpmaWdfZDFkX2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QxZF9hZF9zY29yZWRfYWRbWzFdXSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMyMSwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDcpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMyMSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDcpKSkKCmZpZ19kMWRfYWRfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWdfZDFkX2FkX3Bsb3RzLCBmaWdfZDFkX2FkX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4yKSkKCmZpZ19kMWRfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAxZDogQWR1bHRzIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kMWRfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDFkX2FkX3RpdGxlLCBmaWdfZDFkX2FkX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxLjJ9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKcGxvdF9ncmlkKGZpZ19kMWFfYWRfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgIGZpZ19kMWJfYWRfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgIGZpZ19kMWNfYWRfcGxvdHNfbGVnX3RpdGxlLCBuY29sID0gMSkKYGBgCgpUaGUgdmlzdWFsaXphdGlvbnMgb2YgcmVsYXRpb25zaGlwcyBhbW9uZyBzY29yZXMgb24gdGhlc2UgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyBhcmUgcmVtYXJrYWJseSBzaW1pbGFyIGFjcm9zcyBTdHVkaWVzIDFhLTFjIChzZWUgRmlndXJlIDQuMSwgcm93cyBBLUMpLgoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkZpcnN0IEkgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIEhFQVJUIChGaWd1cmUgNC4xLCBsZWZ0bW9zdCBjb2x1bW46IHBhbmVscyBBMSwgQjEsIGFuZCBDMSkuIFRvIG15IGV5ZXMsIHRoZSBtb3N0IHN0cmlraW5nIGZlYXR1cmVzIG9mIHRoZXNlIHZpc3VhbGl6YXRpb25zIGFyZSB0aGF0ICgxKSB0aGVyZSBpcyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcyAoYW4gb2JzZXJ2YXRpb24gY29uZmlybWVkIGJ5IHNpZ25pZmljYW50bHkgcG9zaXRpdmUgUGVhcnNvbiBjb3JyZWxhdGlvbnM7IFN0dWR5IDFhOiBgciBzY29yZV9jb3JfcHJpbnRfZnVuKGQxYV9hZF9zY29yZWRfYWQsICJCT0RZIHZzLiBIRUFSVCIpYDsgU3R1ZHkgMWI6IGByIHNjb3JlX2Nvcl9wcmludF9mdW4oZDFiX2FkX3Njb3JlZF9hZCwgIkJPRFkgdnMuIEhFQVJUIilgOyBTdHVkeSAxYzogU3R1ZHkgMWM6IGByIHNjb3JlX2Nvcl9wcmludF9mdW4oZDFjX2FkX3Njb3JlZF9hZCwgIkJPRFkgdnMuIEhFQVJUIilgKTsgYW5kICgyKSB0aGVyZSBhcmUgdmlydHVhbGx5IG5vIGRhdGFwb2ludHMgYWJvdmUgdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5ID0geCQsIGRvdHRlZCBkaWFnb25hbCBsaW5lKSwgYW5kIGNlcnRhaW5seSBubyBkYXRhcG9pbnRzIGluIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgcGxvdCBvZiB0aGVzZSBwbG90cy4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgdGVuZGVkIHRvIGVuZG9yc2UgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX0JPRFlfIHNjYWxlIGF0IGxlYXN0IGFzIHN0cm9uZ2x5LCBhbmQgb2Z0ZW4gbW9yZSBzdHJvbmdseSwgdGhhbiB0aGV5IGVuZG9yc2VkIGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfSEVBUlRfIHNjYWxl4oCUaW4gb3RoZXIgd29yZHMsIHRoYXQgbWFueSBwYXJ0aWNpcGFudHMgYXR0cmlidXRlZCBtb3JlIEJPRFkgdGhhbiBIRUFSVCB0byB0aGUgdGFyZ2V0IGNoYXJhY3RlciBpbiBxdWVzdGlvbiwgYnV0IHZpcnR1YWxseSBubyBwYXJ0aWNpcGFudHMgYXR0cmlidXRlIG1vcmUgSEVBUlQgdGhhbiBCT0RZLiBUaGlzIGFzeW1tZXRyeSBhcHBlYXJzIHRvIGhhdmUgYmVlbiBkcml2ZW4gcHJpbWFyaWx5IGJ5IHBhcnRpY2lwYW50cycgYXNzZXNzbWVudHMgb2YgdGhlIGJlZXRsZSAoaW4gcmVkKTsgZm9yIHRoZSByb2JvdCAoaW4gYmx1ZSksIF9CT0RZXyBhbmQgX0hFQVJUXyBzY29yZXMgYXBwZWFyIHRvIGhhdmUgYmVlbiBtb3JlIHNpbWlsYXIgKGNsb3NlIHRvIHRoZSBkb3R0ZWQgbGluZSksIGFuZCB3ZXJlIGdlbmVyYWxseSBxdWl0ZSBsb3cuIAoKIyMjIyMgQk9EWSB2cy4gTUlORAoKTmV4dCBJIGNvbnNpZGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBCT0RZIGFuZCBNSU5EIChGaWd1cmUgNC4xLCBjZW50ZXIgY29sdW1uOiBwYW5lbHMgQTIsIEIyLCBhbmQgQzIpLiBTaW1pbGFyIHRvIHRoZSBCT0RZIHZzLiBIRUFSVCBjb21wYXJpc29uLCB0d28gbm90YWJsZSBmZWF0dXJlcyBvZiB0aGVzZSB2aXN1YWxpemF0aW9ucyBhcmUgdGhhdCAoMSkgdGhlcmUgaXMgYSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzY29yZXMgb24gdGhlIF9CT0RZXyBhbmQgX01JTkRfIHNjYWxlcyAoYW4gb2JzZXJ2YXRpb24gY29uZmlybWVkIGJ5IHNpZ25pZmljYW50bHkgcG9zaXRpdmUgUGVhcnNvbiBjb3JyZWxhdGlvbnM7IFN0dWR5IDFhOiBgciBzY29yZV9jb3JfcHJpbnRfZnVuKGQxYV9hZF9zY29yZWRfYWQsICJCT0RZIHZzLiBNSU5EIilgOyBTdHVkeSAxYjogYHIgc2NvcmVfY29yX3ByaW50X2Z1bihkMWJfYWRfc2NvcmVkX2FkLCAiQk9EWSB2cy4gTUlORCIpYDsgU3R1ZHkgMWM6IFN0dWR5IDFjOiBgciBzY29yZV9jb3JfcHJpbnRfZnVuKGQxY19hZF9zY29yZWRfYWQsICJCT0RZIHZzLiBNSU5EIilgKTsgYW5kICgyKSB0aGVyZSBhcmUgZmV3ZXIgZGF0YXBvaW50cyBiZWxvdyB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpIHRoYW4gYWJvdmUgaXQsIGFuZCBubyBkYXRhcG9pbnRzIGluIHRoZSBsb3dlciByaWdodCBjb3JuZXIgb2YgdGhlIHBsb3Qgb2YgdGhlc2UgcGxvdHMuIE1vc3QgcGFydGljaXBhbnRzIHRlbmRlZCB0byBlbmRvcnNlIHRoZSBtZW50YWwgY2FwYWNpdHkgaXRlbXMgaW5jbHVkZWQgaW4gdGhlIF9NSU5EXyBzY2FsZSByb3VnaGx5IGFzIHN0cm9uZ2x5LCBhbmQgc29tZXRpbWVzIG1vcmUgc3Ryb25nbHksIHRoYW4gdGhleSBlbmRvcnNlZCBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX0JPRFlfIHNjYWxlLCB3aGlsZSByZWxhdGl2ZWx5IGZldyBwYXJ0aWNpcGFudHMgZW5kb3JzZWQgX01JTkRfIGl0ZW1zIGxlc3Mgc3Ryb25nbHkgdGhhbiBfQk9EWV8gaXRlbXMuIEhvd2V2ZXIsIHZpc3VhbCBpbnNwZWN0aW9uIHN1Z2dlc3RzIHRoYXQgdGhpcyBhc3ltbWV0cnkgd2FzIGxlc3MgZXh0cmVtZSB0aGFuIHRoZSBhc3ltbWV0cnkgYmV0d2VlbiBfQk9EWV8gYW5kIF9IRUFSVF8gc2NvcmVzIGp1c3QgZGVzY3JpYmVkLiBJbiB0aGlzIGNhc2UsIHRoZSBhc3ltbWV0cnkgYmV0d2VlbiBfQk9EWV8gYW5kIF9NSU5EXyBhcHBlYXJzIHRvIGhhdmUgYmVlbiBkcml2ZW4gcHJpbWFyaWx5IGJ5IHBhcnRpY2lwYW50cycgYXNzZXNzbWVudHMgb2YgdGhlIHJvYm90IChpbiBibHVlKTsgZm9yIHRoZSBiZWV0bGUgKGluIHJlZCksIF9CT0RZXyBhbmQgX01JTkRfIHNjb3JlcyBhcHBlYXIgdG8gaGF2ZSBiZWVuIG1vcmUgc2ltaWxhciAoY2xvc2UgdG8gdGhlIGRvdHRlZCBsaW5lKS4gCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKRmluYWxseSBJIGNvbnNpZGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBIRUFSVCBhbmQgTUlORCAoRmlndXJlIDQuMSwgcmlnaHRtb3N0IGNvbHVtbjogcGFuZWxzIEEzLCBCMywgYW5kIEMzKS4gQWdhaW4sIHR3byBmZWF0dXJlcyBvZiB0aGVzZSB2aXN1YWxpemF0aW9ucyBhcmUgcGFydGljdWxhcmx5IHN0cmlraW5nOiAoMSkgVGhlcmUgaXMgYSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzY29yZXMgb24gdGhlIF9NSU5EXyBhbmQgX0hFQVJUXyBzY2FsZXMgKGFuIG9ic2VydmF0aW9uIGNvbmZpcm1lZCBieSBzaWduaWZpY2FudGx5IHBvc2l0aXZlIFBlYXJzb24gY29ycmVsYXRpb25zOyBTdHVkeSAxYTogYHIgc2NvcmVfY29yX3ByaW50X2Z1bihkMWFfYWRfc2NvcmVkX2FkLCAiSEVBUlQgdnMuIE1JTkQiKWA7IFN0dWR5IDFiOiBgciBzY29yZV9jb3JfcHJpbnRfZnVuKGQxYl9hZF9zY29yZWRfYWQsICJIRUFSVCB2cy4gTUlORCIpYDsgU3R1ZHkgMWM6IFN0dWR5IDFjOiBgciBzY29yZV9jb3JfcHJpbnRfZnVuKGQxY19hZF9zY29yZWRfYWQsICJIRUFSVCB2cy4gTUlORCIpYCk7IGFuZCAoMikgdGhlcmUgYXJlIHZpcnR1YWxseSBfbm9fIGRhdGFwb2ludHMgYmVsb3cgdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5ID0geCQsIGRvdHRlZCBkaWFnb25hbCBsaW5lKS4gVGhlIGFzeW1tZXRyeSBiZXR3ZWVuIF9NSU5EXyBhbmQgX0hFQVJUXyBzY29yZXMgYXBwZWFycyB0byBoYXZlIGJlZW4gcGFydGljdWxhcmx5IGV4dHJlbWU6IEFsbW9zdCBfYWxsXyBwYXJ0aWNpcGFudHMgZW5kb3JzZWQgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX01JTkRfIHNjYWxlIG1vcmUgc3Ryb25nbHkgdGhhbiB0aGUgaXRlbXMgaW5jbHVkZWQgaW4gdGhlIF9IRUFSVF8gc2NhbGUuIEluIHRoaXMgY2FzZSwgdGhpcyBhc3ltbWV0cnkgYXBwZWFycyB0byBiZSBib3JuIG91dCBmb3IgYm90aCB0YXJnZXQgY2hhcmFjdGVycywgYnV0IHBlcmhhcHMgbW9yZSBleGFnZ2VyYXRlZCBmb3IgdGhlIGJlZXRsZSAoaW4gcmVkKSB0aGFuIHRoZSByb2JvdCAoaW4gYmx1ZSkuCgpgYGB7cn0KZmlndXJlNC4xIDwtIHBsb3RfZ3JpZChmaWdfZDFhX2FkX3Bsb3RzX2xlZ190aXRsZSwgZmlnX2QxYl9hZF9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgZmlnX2QxY19hZF9wbG90c19sZWdfdGl0bGUsIGZpZ19kMWRfYWRfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDEsIDEsIDEuMTUpKQoKZmlndXJlNC4xX2NhcCA8LSBhZGRfc3ViKGZpZ3VyZTQuMSwgc3RyX3dyYXAoIkZpZ3VyZSA0LjE6IFJlbGF0aW9uc2hpcHMgYW1vbmcgVVMgYWR1bHRzJyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkaWVzIDFhLTFkLCBvcmdhbml6ZWQgYnkgc3R1ZHkgKHJvd3MpIGFuZCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKGNvbHVtbnMpLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMS4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZC4gUGVhcnNvbiBjb3JyZWxhdGlvbnMgYXJlIHJlcG9ydGVkIGZvciBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cy4iLCAxMTApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDEuOH0KZ2dkcmF3KGZpZ3VyZTQuMV9jYXApCmBgYAoKIyMjIyBBbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKSGVyZSBJIHByb3ZpZGUgYSBmb3JtYWwgYW5hbHlzaXMgb2YgdGhlIGFzeW1tZXRyaWVzIHJldmVhbGVkIGJ5IHRoZSB2aXN1YWxpemF0aW9ucyBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4gRm9yIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChCT0RZIHZzLiBIRUFSVCwgQk9EWSB2cy4gTUlORCwgYW5kIEhFQVJUIHZzLiBNSU5EKSwgSSBjb25kdWN0IGEgQmF5ZXNpYW4gcmVncmVzc2lvbiB0byBjb21wYXJlIGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gdGhlc2UgdHdvIGNvbmNlcHR1YWwgdW5pdHMgdG8gemVybywgY29udHJvbGxpbmcgZm9yIGRpZmZlcmVuY2VzIGluIGFzc2Vzc21lbnRzIG9mIHRoZSB0d28gImVkZ2UgY2FzZXMiIHRoYXQgd2VyZSBmZWF0dXJlZCBhcyB0YXJnZXQgY2hhcmFjdGVycyBpbiB0aGVzZSBzdHVkaWVzIChhIGJlZXRsZSB2cyBhIHJvYm90KSwgYW5kIGluY2x1ZGluZyBtYXhpbWFsIHJhbmRvbSBlZmZlY3RzIHN0cnVjdHVyZXMgKGluIHRoaXMgY2FzZSwgbm8gcmFuZG9tIGVmZmVjdHMgZm9yIFN0dWRpZXMgMWEgYW5kIDFiLCBhbmQgcmFuZG9tIGludGVyY2VwdHMgZm9yIHBhcnRpY2lwYW50cyBpbiBTdHVkeSAxYykuIFNlZSBGaWd1cmUgNC4yLCBwYW5lbHMgQS1DIGZvciB2aXN1YWwgZGVwaWN0aW9ucyBvZiB0aGVzZSBkaWZmZXJlbmNlIHNjb3Jlcy4KCmBgYHtyfQpkMWFfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9mdW4oZDFhX2FkX3Njb3JlZF9hZCkKY29udHJhc3RzKGQxYV9hZF9zY29yZWRfYWRfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZWRnZQoKc2F2ZVJEUyhkMWFfYWRfc2NvcmVkX2FkX2RpZmYsICIuL3N0b3JlZC9kaWZmc2NvcmVfZGF0YS9kMWFfYWRfc2NvcmVkX2FkX2RpZmYiKQpgYGAKCmBgYHtyfQpwbG90X2QxYV9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDFhX2FkX3Njb3JlZF9hZF9kaWZmKQpgYGAKCmBgYHtyfQojIHJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDFhX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULCAKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpzdW1tYXJ5KHJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQxYV9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsIAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpyX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnN1bW1hcnkocl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDFhX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5ELCAKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kMWFfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9yZWdfdGFibGVfZnVuKAogIHJlZ19saXN0ID0gbGlzdChyX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpLAogIHBhaXJfbGlzdCA9IGMoIkJPRFkgLSBIRUFSVCIsICJCT0RZIC0gTUlORCIsICJIRUFSVCAtIE1JTkQiKSwKICBzdHVkeV9uYW1lID0gIlN0dWR5IDFhIiwKICBjaGFyX2xhYmVsID0gIlJvYm90IHZzLiBHTSIpCmBgYAoKCmBgYHtyfQpkMWJfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9mdW4oZDFiX2FkX3Njb3JlZF9hZCkKY29udHJhc3RzKGQxYl9hZF9zY29yZWRfYWRfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZWRnZQoKc2F2ZVJEUyhkMWJfYWRfc2NvcmVkX2FkX2RpZmYsICIuL3N0b3JlZC9kaWZmc2NvcmVfZGF0YS9kMWJfYWRfc2NvcmVkX2FkX2RpZmYiKQpgYGAKCmBgYHtyfQpwbG90X2QxYl9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDFiX2FkX3Njb3JlZF9hZF9kaWZmKQpgYGAKCmBgYHtyfQojIHJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDFiX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKcl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnN1bW1hcnkocl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDFiX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKcl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpzdW1tYXJ5KHJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQxYl9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kMWJfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9yZWdfdGFibGVfZnVuKAogIHJlZ19saXN0ID0gbGlzdChyX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpLAogIHBhaXJfbGlzdCA9IGMoIkJPRFkgLSBIRUFSVCIsICJCT0RZIC0gTUlORCIsICJIRUFSVCAtIE1JTkQiKSwKICBzdHVkeV9uYW1lID0gIlN0dWR5IDFiIiwKICBjaGFyX2xhYmVsID0gIlJvYm90IHZzLiBHTSIpCmBgYAoKCmBgYHtyfQpkMWNfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9mdW4oZDFjX2FkX3Njb3JlZF9hZCkKY29udHJhc3RzKGQxY19hZF9zY29yZWRfYWRfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZWRnZQoKc2F2ZVJEUyhkMWNfYWRfc2NvcmVkX2FkX2RpZmYsICIuL3N0b3JlZC9kaWZmc2NvcmVfZGF0YS9kMWNfYWRfc2NvcmVkX2FkX2RpZmYiKQpgYGAKCmBgYHtyfQpwbG90X2QxY19hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDFjX2FkX3Njb3JlZF9hZF9kaWZmKQpgYGAKCmBgYHtyfQojIHJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkMWNfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpyX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQxY19hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKc3VtbWFyeShyX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQxY19hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxY19hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kMWNfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9yZWdfdGFibGVfZnVuKAogIHJlZ19saXN0ID0gbGlzdChyX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpLAogIHBhaXJfbGlzdCA9IGMoIkJPRFkgLSBIRUFSVCIsICJCT0RZIC0gTUlORCIsICJIRUFSVCAtIE1JTkQiKSwKICBzdHVkeV9uYW1lID0gIlN0dWR5IDFjIiwKICBjaGFyX2xhYmVsID0gIlJvYm90IHZzLiBHTSIpCmBgYAoKYGBge3J9CmQxZF9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX2Z1bihkMWRfYWRfc2NvcmVkX2FkKQpjb250cmFzdHMoZDFkX2FkX3Njb3JlZF9hZF9kaWZmJGNoYXJhY3RlcikgPC0gY29udHJhc3RzX3N1bV9kdjIxCgpzYXZlUkRTKGQxZF9hZF9zY29yZWRfYWRfZGlmZiwgIi4vc3RvcmVkL2RpZmZzY29yZV9kYXRhL2QxZF9hZF9zY29yZWRfYWRfZGlmZiIpCmBgYAoKYGBge3J9CnBsb3RfZDFkX2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZwbG90X2Z1bihkMWRfYWRfc2NvcmVkX2FkX2RpZmYsIGNvbG9ycyA9IGNvbG9yczIxKQpgYGAKCmBgYHtyfQojIGQxZCByZWdyZXNzaW9ucyBkb25lIGJlbG93CmBgYAoKYGBge3J9CnJlZ3RhYl9zdHVkeTFhYmMgPC0gcmVndGFiX2QxYV9hZF9zY29yZWRfYWRfZGlmZiAlPiUKICBmdWxsX2pvaW4ocmVndGFiX2QxYl9hZF9zY29yZWRfYWRfZGlmZikgJT4lCiAgZnVsbF9qb2luKHJlZ3RhYl9kMWNfYWRfc2NvcmVkX2FkX2RpZmYpICU+JQogIG11dGF0ZV9hdCh2YXJzKGIsIHMuZS4pLAogICAgICAgICAgICBmdW5zKGZvcm1hdChyb3VuZCguLCBkaWdpdHMgPSAyKSwgbnNtYWxsID0gMikpKSAlPiUKICB1bml0ZShyZXN1bHQsIGIsIHMuZS4sIENJOTUsIG5vbnplcm8pICU+JQogIHNwcmVhZChzdHVkeSwgcmVzdWx0KSAlPiUKICBzZXBhcmF0ZShgU3R1ZHkgMWFgLCBjKCJzMWFfYiIsICJzMWFfcy5lLiIsICJzMWFfOTUlIENJIiwgInMxYV9ueiIpLCBzZXAgPSAiXyIpICU+JQogIHNlcGFyYXRlKGBTdHVkeSAxYmAsIGMoInMxYl9iIiwgInMxYl9zLmUuIiwgInMxYl85NSUgQ0kiLCAiczFiX256IiksIHNlcCA9ICJfIikgJT4lCiAgc2VwYXJhdGUoYFN0dWR5IDFjYCwgYygiczFjX2IiLCAiczFjX3MuZS4iLCAiczFjXzk1JSBDSSIsICJzMWNfbnoiKSwgc2VwID0gIl8iKQpgYGAKCmBgYHtyfQojIGludGVyaW0gdGFibGUgZm9yIGVhc2Ugb2Ygd3JpdGluZwpyZWd0YWJfc3R1ZHkxYWJjICU+JQogIHNlbGVjdCgtZW5kc193aXRoKCJzLmUuIikpICU+JQogIGZpbHRlcihwYXJhbSA9PSAiSW50ZXJjZXB0IikgJT4lCiAga2FibGUoZGlnaXRzID0gMikgJT4lCiAga2FibGVfc3R5bGluZygpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKcGxvdF9ncmlkKHBsb3RfZDFhX2FkX3Njb3JlZF9hZF9kaWZmLCAKICAgICAgICAgIHBsb3RfZDFiX2FkX3Njb3JlZF9hZF9kaWZmLCAKICAgICAgICAgIHBsb3RfZDFjX2FkX3Njb3JlZF9hZF9kaWZmLAogICAgICAgICAgbmNvbCA9IDMpCmBgYAoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkFjcm9zcyBTdHVkaWVzIDFhLTFjLCBfQk9EWV8gdnMuIF9IRUFSVF8gZGlmZmVyZW5jZSBzY29yZXMgd2VyZSBzdWJzdGFudGlhbGx5IG5vbi16ZXJvLCBpbiB0aGUgZGlyZWN0aW9uIG9mIHBhcnRpY2lwYW50cyBlbmRvcnNpbmcgX0JPRFlfIGl0ZW1zIG1vcmUgc3Ryb25nbHkgdGhhbiBfSEVBUlRfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQuMikuIEFzIEkgc3BlY3VsYXRlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgaW4gYWxsIHN0dWRpZXMgdGhpcyBkaWZmZXJlbmNlIHdhcyBkcml2ZW4gYnkgcGFydGljaXBhbnRzJyBhc3Nlc3NtZW50cyBvZiB0aGUgYmVldGxlOyBpbiB0aGUgYWdncmVnYXRlLCBkaWZmZXJlbmNlIHNjb3JlcyB3ZXJlIHJlZHVjZWQgdG8gMCBmb3IgdGhlIHJvYm90IChzZWUgdGhlICJSb2JvdCB2cy4gR00iIHJvdyBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQuMikuICAKCiMjIyMjIEJPRFkgdnMuIE1JTkQKCkFjcm9zcyBTdHVkaWVzIDFhLTFjLCBfQk9EWV8gdnMuIF9NSU5EXyBkaWZmZXJlbmNlIHNjb3JlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9CT0RZXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuMikuIEluIGFsbCBzdHVkaWVzIHRoaXMgZGlmZmVyZW5jZSB3YXMgZHJpdmVuIGJ5IHBhcnRpY2lwYW50cycgYXNzZXNzbWVudHMgb2YgdGhlIHJvYm90OyBpbiB0aGUgYWdncmVnYXRlLCBkaWZmZXJlbmNlIHNjb3JlcyB3ZXJlIHJlZHVjZWQgdG8gMCBmb3IgdGhlIGJlZXRsZSAoc2VlIHRoZSAiUm9ib3QgdnMuIEdNIiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuMikuCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKQWNyb3NzIFN0dWRpZXMgMWEtMWMsIF9IRUFSVF8gdnMuIF9NSU5EXyBkaWZmZXJlbmNlIHNjb3JlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC4yKS4gSW4gYWxsIHN0dWRpZXMgdGhpcyBkaWZmZXJlbmNlIHdhcyBzb21ld2hhdCBleGFnZ2VyYXRlZCBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgcm9ib3QsIHJlbGF0aXZlIHRvIHRoZSBiZWV0bGUgKHNlZSB0aGUgIlJvYm90IHZzLiBHTSIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC4yKS4KCmBgYHtyfQpmaWd1cmU0LjJfcGxvdHMxMjMgPC0gcGxvdF9ncmlkKHBsb3RfZDFhX2FkX3Njb3JlZF9hZF9kaWZmICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDFhOiBBZHVsdHMiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90X2QxYl9hZF9zY29yZWRfYWRfZGlmZiArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJTdHVkeSAxYjogQWR1bHRzIikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90X2QxY19hZF9zY29yZWRfYWRfZGlmZiArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJTdHVkeSAxYzogQWR1bHRzIikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDMsIHJlbF93aWR0aHMgPSBjKDEsIDEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9ICJBVVRPIikKCmZpZ3VyZTQuMl9wbG90czEyM19sZWcgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuMl9wbG90czEyMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90X2QxYV9hZF9zY29yZWRfYWRfZGlmZiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMSkpCgpmaWd1cmU0LjJfcGxvdHM0IDwtIHBsb3RfZ3JpZChwbG90X2QxZF9hZF9zY29yZWRfYWRfZGlmZiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJTdHVkeSAxZDogQWR1bHRzIikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9ICJEIikKCmZpZ3VyZTQuMl9wbG90czRfbGVnIDwtIHBsb3RfZ3JpZChmaWd1cmU0LjJfcGxvdHM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2xlZ2VuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdF9kMWRfYWRfc2NvcmVkX2FkX2RpZmYgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMikpCgpmaWd1cmU0LjJfcGxvdHMgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuMl9wbG90czEyM19sZWcsIGZpZ3VyZTQuMl9wbG90czRfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMS4xKSkKCmZpZ3VyZTQuMl9jYXAgPC0gYWRkX3N1YihmaWd1cmU0LjJfcGxvdHMsIHN0cl93cmFwKCJGaWd1cmUgNC4yOiBEaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIFVTIGFkdWx0cycgYXR0cmlidXRpb25zIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZGllcyAxYS0xZC4gRm9yIGVhY2ggY29uY2VwdHVhbCB1bml0LCBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAwLTEsIHN1Y2ggdGhhdCBkaWZmZXJlbmNlIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIC0xIHRvICsxLiBJbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBhcmUgcGxvdHRlZCBhcyBzbWFsbCwgdHJhbnNsdWNlbnQgY2lyY2xlcywgYW5kIG1lYW4gZGlmZmVyZW5jZSBzY29yZXMgYnkgY2hhcmFjdGVyIGFyZSBwbG90dGVkIGFzIGxhcmdlciwgc29saWQgZGlhbW9uZHMuIEVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFRoZSBkb3R0ZWQgbGluZSBjb3JyZXNwb25kcyB0byBlcXVhbCBlbmRvcnNlbWVudHMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIHBsb3R0ZWQgKGkuZS4sIGEgZGlmZmVyZW5jZSBzY29yZSBvZiAwKS4iLCAxNDApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuOH0KZ2dkcmF3KGZpZ3VyZTQuMl9jYXApCmBgYAoKYGBge3J9CnRhYmxlNC4yIDwtIHJlZ3RhYl9zdHVkeTFhYmMgJT4lCiAgc2VsZWN0KC1wYWlyLCAtZW5kc193aXRoKCJfcy5lLiIpKSAlPiUKICByZW5hbWUoUGFyYW1ldGVyID0gcGFyYW0pICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJueiIsICIgIiwgLikpKSAlPiUKICByZW5hbWVfYWxsKGZ1bnMoZ3N1YigiczEuXyIsICIiLCAuKSkpICU+JQogIGthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKGMocmVwKCJyIiwgMiksICJsIiksIDMpKSwgCiAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSA0LjI6IFJlZ3Jlc3Npb24gYW5hbHlzZXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgZm9yIFVTIGFkdWx0cyBpbiBTdHVkaWVzIDFhLTFjLiBUaGUgdGFibGUgcHJlc2VudHMgcmVzdWx0cyBmcm9tIHNlcGFyYXRlIEJheWVzaWFuIHJlZ3Jlc3Npb25zIG9mIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChCT0RZIHZzLiBIRUFSVCwgQk9EWSB2cy4gTUlORCwgYW5kIEhFQVJUIHZzLiBNSU5EKS4gRWFjaCByZWdyZXNzaW9uIGluY2x1ZGVkIHR3byBmaXhlZCBlZmZlY3QgcGFyYW1ldGVyczogKDEpIHRoZSBpbnRlcmNlcHQsIHdoaWNoIEkgdHJlYXQgYXMgYW4gaW5kZXggb2YgdGhlIGFzeW1tZXRyeSBpbiBhdHRyaWJ1dGlvbnMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIGluIHF1ZXN0aW9uOyBhbmQgKDIpIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzLCByZXBvcnRlZCBoZXJlIGFzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByb2JvdCBhbmQgdGhlIGdyYW5kIG1lYW4gKEdNKS4gSW50ZXJjZXB0cyBhcmUgaGlnaGxpZ2h0ZWQgaW4gYm9sZCwgYmVjYXVzZSB0aGVzZSBhcmUgdGhlIHByaW1hcnkgcGFyYW1ldGVycyBvZiBpbnRlcmVzdCBmb3IgdGhlc2UgYW5hbHlzZXMuIEZvciBlYWNoIHBhcmFtZXRlciwgdGhlIHRhYmxlIGluY2x1ZGVzIHRoZSBlc3RpbWF0ZSAoYikgYW5kIGEgOTUlIGNyZWRpYmxlIGludGVydmFsIGZvciB0aGF0IGVzdGltYXRlLiBBc3Rlcmlza3MgaW5kaWNhdGUgOTUlIGNyZWRpYmxlIGludGVydmFscyB0aGF0IGRvIG5vdCBpbmNsdWRlIDAuIikgJT4lICAKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgcm93X3NwZWMoYygxLCAzLCA1KSwgYm9sZCA9IFQpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBIRUFSVCIsIDEsIDIpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBNSU5EIiwgMywgNCkgJT4lCiAgZ3JvdXBfcm93cygiSEVBUlQgLSBNSU5EIiwgNSwgNikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICJTdHVkeSAxYSIgPSAzLAogICAgICAgICAgICAgICAgICAgICAiU3R1ZHkgMWIiID0gMywKICAgICAgICAgICAgICAgICAgICAgIlN0dWR5IDFjIiA9IDMpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KdGFibGU0LjIKYGBgCgojIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKQWNyb3NzIFN0dWRpZXMgMWEtMWMsIHZpc3VhbCBpbnNwZWN0aW9uIG9mIHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBjb25jZXB0dWFsIHVuaXRzIGlkZW50aWZpZWQgaW4gQ2hhcHRlciBJSUkgKEJPRFksIEhFQVJULCBhbmQgTUlORCkgc3VnZ2VzdGVkIHRoYXQgYWxsIG9mIHRoZXNlIHJlbGF0aW9uc2hpcHMgYXJlIGNoYXJhY3Rlcml6ZWQgYnkgdHdvIGZlYXR1cmVzOiAoMSkgUG9zaXRpdmUgY29udGluZ2VuY2llcywgc3VjaCB0aGF0IHRoZSBtb3JlIHN0cm9uZ2x5IGEgcGFydGljaXBhbnQgZW5kb3JzZWQgb25lIGNvbmNlcHR1YWwgdW5pdCwgdGhlIG1vcmUgc3Ryb25nbHkgdGhleSB0ZW5kZWQgdG8gZW5kb3JzZSB0aGUgb3RoZXJzOyBhbmQgKDIpIFJvYnVzdCBhc3ltbWV0cmllcywgc3VjaCB0aGF0IHBhcnRpY2lwYW50cyB0ZW5kZWQgdG8gZW5kb3JzZSBNSU5EIG1vcmUgc3Ryb25nbHkgdGhhbiBCT0RZIG9yIEhFQVJULCBhbmQgSEVBUlQgbW9yZSBzdHJvbmdseSB0aGFuIE1JTkQuIFRoZXNlIGFzeW1tZXRyaWVzIHdlcmUgbW9zdCBwcm9ub3VuY2VkIGZvciBjb21wYXJpc29ucyBpbnZvbHZpbmcgSEVBUlQsIHdpdGggdGhlIHZhc3QgbWFqb3JpdHkgb2YgcGFydGljaXBhbnRzIGluIGFsbCB0aHJlZSBvZiB0aGVzZSBzdHVkaWVzIGVuZG9yc2luZyBib3RoIEJPRFkgYW5kIE1JTkQgbW9yZSBzdHJvbmdseSB0aGFuIEhFQVJUIGZvciBib3RoIG9mIHRoZSAiZWRnZSBjYXNlIiBjaGFyYWN0ZXJzIGluY2x1ZGVkIGluIHRoZXNlIHN0dWRpZXMgKGEgYmVldGxlIGFuZCBhIHJvYm90KS4gRm9ybWFsIGFuYWx5c2VzIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGFjcm9zcyB0aGUgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyBpbiBTdHVkaWVzIDFhLTFjIGNvbmZpcm1lZCB0aGVzZSBvYnNlcnZhdGlvbnMuCgojIyMgU3R1ZHkgMWQKCiMjIyMgU2NhbGUgY29uc3RydWN0aW9uCgpgYGB7cn0KIyBkb25lIGFib3ZlCmBgYAoKRm9sbG93aW5nIHRoZSBzdGVwcyBkZXNjcmliZWQgaW4gdGhlICJHZW5lcmFsIGFuYWx5c2lzIHBsYW4sIiBhYm92ZSwgeWllbGRlZCBgciBmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxZF9hZClgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3dkbV9kMWRfYWQgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpYCBpdGVtcyBlYWNoLCB3aXRoIGEgbGFyZ2UgZGVncmVlIG9mIG92ZXJsYXAgaW4gaXRlbXMgYmV0d2VlbiB0aGVzZSBzY2FsZXMgYW5kIHRoZSBzY2FsZXMgZGVyaXZlZCBmcm9tIFN0dWRpZXMgMWEtMWM7IHNlZSBUYWJsZSA0LjEuCgojIyMjIFZpc3VhbGl6YXRpb24KCmBgYHtyfQojIGRvbmUgYWJvdmUKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNDV9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKZmlnX2QxZF9hZF9wbG90c19sZWdfdGl0bGUKYGBgCgpWaXN1YWxpemF0aW9ucyBvZiByZWxhdGlvbnNoaXBzIGFtb25nIHNjb3JlcyBvbiB0aGVzZSBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzIGFyZSBwcm92aWRlZCBpbiBGaWd1cmUgNC4xLCByb3cgRC4KCiMjIyMjIEJPRFkgdnMuIEhFQVJUCgpGaXJzdCBJIGNvbnNpZGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBCT0RZIGFuZCBIRUFSVCAoRmlndXJlIDQuMSwgcGFuZWwgRDEpLiBNdWNoIGFzIGluIFN0dWRpZXMgMWEtMWMgKHJvd3MgQS1DKSwgdGhlIG1vc3Qgc3RyaWtpbmcgZmVhdHVyZXMgb2YgdGhpcyB2aXN1YWxpemF0aW9uIGFyZSB0aGF0ICgxKSB0aGVyZSBpcyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcyAoYHIgc2NvcmVfY29yX3ByaW50X2Z1bihkMWRfYWRfc2NvcmVkX2FkLCAiQk9EWSB2cy4gSEVBUlQiKWApOyBhbmQgKDIpIHRoZXJlIGFyZSB2aXJ0dWFsbHkgbm8gZGF0YXBvaW50cyBhYm92ZSB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpLCBhbmQgY2VydGFpbmx5IG5vIGRhdGFwb2ludHMgaW4gdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBwbG90LiBJbmRpdmlkdWFsIHBhcnRpY2lwYW50cyB0ZW5kZWQgdG8gZW5kb3JzZSB0aGUgbWVudGFsIGNhcGFjaXR5IGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfQk9EWV8gc2NhbGUgYXQgbGVhc3QgYXMgc3Ryb25nbHksIGFuZCBvZnRlbiBtb3JlIHN0cm9uZ2x5LCB0aGFuIHRoZXkgZW5kb3JzZWQgaXRlbXMgaW5jbHVkZWQgaW4gdGhlIF9IRUFSVF8gc2NhbGXigJRpbiBvdGhlciB3b3JkcywgbWFueSBwYXJ0aWNpcGFudHMgYXR0cmlidXRlZCBtb3JlIEJPRFkgdGhhbiBIRUFSVCB0byB0aGUgdGFyZ2V0IGNoYXJhY3RlciBpbiBxdWVzdGlvbiwgYnV0IHZpcnR1YWxseSBubyBwYXJ0aWNpcGFudHMgYXR0cmlidXRlZCBtb3JlIEhFQVJUIHRoYW4gQk9EWS4gCgpWaXN1YWwgaW5zcGVjdGlvbiBvZiBtZWFuIHNjb3JlcyBieSB0YXJnZXQgY2hhcmFjdGVyIGZ1cnRoZXIgcmV2ZWFscyB0aGF0LCBpbiB0aGUgYWdncmVnYXRlLCBjaGFyYWN0ZXJzIHRoYXQgcmVjZWl2ZWQgcmVsYXRpdmVseSBsb3cgX0JPRFlfIHNjb3JlcyAoZS5nLiwgaW5lcnQgb2JqZWN0cywgdGVjaG5vbG9naWVzLCB0aGUgZmV0dXMsIHRoZSBwZXJzb24gaW4gYSBwZXJzaXN0ZW50IHZlZ2V0YXRpdmUgc3RhdGUsIGFuZCBzdWNoICJsb3dlciIgbGlmZWZvcm1zIGFzIGEgbWljcm9iZSkgcmVjZWl2ZWQgdW5pdmVyc2FsbHkgbG93IG1lYW4gX0hFQVJUXyBzY29yZXMsIHdoaWxlIGNoYXJhY3RlcnMgdGhhdCByZWNlaXZlZCByZWxhdGl2ZWx5IGhpZ2ggX0JPRFlfIHNjb3JlcyAoZS5nLiwgImhpZ2hlciIgbGlmZWZvcm1zIGxpa2UgYW5pbWFscyBhbmQgdHlwaWNhbCBodW1hbnMpIHZhcmllZCBpbiB0aGVpciBtZWFuIF9IRUFSVF8gc2NvcmVzLiBUaGlzIHJhaXNlcyB0aGUgaW50cmlndWluZyBwb3NzaWJpbGl0eSB0aGF0IGF0dHJpYnV0aW9ucyBvZiBCT0RZIGFuZCBIRUFSVCBtYXkgaGF2ZSBiZWVuIGdvdmVybmVkIGJ5IHNvbWUgc29ydCBvZiAidGhyZXNob2xkIiBtb2RlbCwgaW4gd2hpY2ggYXR0cmlidXRpb25zIG9mIGFueSBzdWJzdGFudGlhbCBhbW91bnQgb2YgSEVBUlQgZGVwZW5kIG9uIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGhhdmluZyBhIGNlcnRhaW4gZGVncmVlIG9mIEJPRFkuCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpOZXh0IEkgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIE1JTkQgKEZpZ3VyZSA0LjEsIHBhbmVsIEQyKS4gQXMgaW4gU3R1ZGllcyAxYS0xYywgdHdvIG5vdGFibGUgZmVhdHVyZXMgb2YgdGhpcyB2aXN1YWxpemF0aW9uIGFyZSB0aGF0ICgxKSB0aGVyZSBpcyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIChgciBzY29yZV9jb3JfcHJpbnRfZnVuKGQxZF9hZF9zY29yZWRfYWQsICJCT0RZIHZzLiBNSU5EIilgKTsgYW5kICgyKSB0aGVyZSBhcmUgZGF0YXBvaW50cyBpbiB0aGUgdXBwZXIgbGVmdCBidXQgbm90IHRoZSBsb3dlciByaWdodCBjb3JuZXIgb2YgdGhlIHBsb3RzLiBIb3dldmVyLCB3aGlsZSBwYXJ0aWNpcGFudHMgd2hvIGFzc2Vzc2VkIGNlcnRhaW4gdGFyZ2V0IGNoYXJhY3RlcnMgKG5hbWVseSwgdGhlIHRlY2hub2xvZ2llcykgdGVuZGVkIHRvIGVuZG9yc2UgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX01JTkRfIHNjYWxlIHJvdWdobHkgYXMgc3Ryb25nbHksIGFuZCBzb21ldGltZXMgbW9yZSBzdHJvbmdseSwgdGhhbiB0aGV5IGVuZG9yc2VkIGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfQk9EWV8gc2NhbGUsIHBhcnRpY2lwYW50cyB3aG8gYXNzZXNzZWQgb3RoZXIgdGFyZ2V0IGNoYXJhY3RlcnMsIGlmIGFueXRoaW5nLCBhcHBlYXIgdG8gaGF2ZSBzaG93biB0aGUgcmV2ZXJzZSBwYXR0ZXJuLCBlbmRvcnNpbmcgX01JTkRfIGl0ZW1zIHNsaWdodGx5IGxlc3Mgc3Ryb25nbHkgdGhhbiBfQk9EWV8gaXRlbXMuIEluIG90aGVyIHdvcmRzLCB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgbGVzcyBjb25zaXN0ZW5jeSBpbiB0aGUgImFzeW1tZXRyeSIgYmV0d2VlbiBCT0RZIGFuZCBNSU5EIGluIFN0dWR5IDFkIHRoYW4gdGhlcmUgd2FzIGluIFN0dWRpZXMgMWEtMWMuCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKRmluYWxseSBJIGNvbnNpZGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBIRUFSVCBhbmQgTUlORCAoRmlndXJlIDQuMSwgcGFuZWwgRDEpLiBNdWNoIGFzIGluIFN0dWRpZXMgMWEtMWMgKHJvd3MgQS1DKSwgdGhlIG1vc3Qgc3RyaWtpbmcgZmVhdHVyZXMgb2YgdGhpcyB2aXN1YWxpemF0aW9uIGFyZSB0aGF0ICgxKSB0aGVyZSBpcyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0hFQVJUXyBhbmQgX01JTkRfIHNjYWxlcyAoYHIgc2NvcmVfY29yX3ByaW50X2Z1bihkMWRfYWRfc2NvcmVkX2FkLCAiSEVBUlQgdnMuIE1JTkQiKWApOyBhbmQgKDIpIHRoZXJlIGFyZSB2aXJ0dWFsbHkgbm8gZGF0YXBvaW50cyBiZWxvdyB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpLCBhbmQgY2VydGFpbmx5IG5vIGRhdGFwb2ludHMgaW4gdGhlIGxvd2VyIHJpZ2h0IGNvcm5lciBvZiB0aGUgcGxvdC4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgdGVuZGVkIHRvIGVuZG9yc2UgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX01JTkRfIHNjYWxlIGF0IGxlYXN0IGFzIHN0cm9uZ2x5LCBhbmQgb2Z0ZW4gbW9yZSBzdHJvbmdseSwgdGhhbiB0aGV5IGVuZG9yc2VkIGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfSEVBUlRfIHNjYWxl4oCUaW4gb3RoZXIgd29yZHMsIG1hbnkgcGFydGljaXBhbnRzIGF0dHJpYnV0ZWQgbW9yZSBNSU5EIHRoYW4gSEVBUlQgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24sIGJ1dCB2aXJ0dWFsbHkgbm8gcGFydGljaXBhbnRzIGF0dHJpYnV0ZWQgbW9yZSBIRUFSVCB0aGFuIE1JTkQuIAoKVmlzdWFsIGluc3BlY3Rpb24gb2YgbWVhbiBzY29yZXMgYnkgdGFyZ2V0IGNoYXJhY3RlciBmdXJ0aGVyIHJldmVhbHMgdGhhdCwgaW4gdGhlIGFnZ3JlZ2F0ZSwgY2hhcmFjdGVycyB0aGF0IHJlY2VpdmVkIHJlbGF0aXZlbHkgbG93IF9NSU5EXyBzY29yZXMgKGUuZy4sIGluZXJ0IG9iamVjdHMsIHRoZSBmZXR1cywgYW5kIHN1Y2ggImxvd2VyIiBsaWZlZm9ybXMgYXMgYSBtaWNyb2JlKSByZWNlaXZlZCB1bml2ZXJzYWxseSBsb3cgbWVhbiBfSEVBUlRfIHNjb3Jlcywgd2hpbGUgY2hhcmFjdGVycyB0aGF0IHJlY2VpdmVkIHJlbGF0aXZlbHkgaGlnaCBfTUlORF8gc2NvcmVzIChlLmcuLCBtb3JlIHNvcGhpc3RpY2F0ZWQgdGVjaG5vbG9naWVzIGFzIHdlbGwgYXMgImhpZ2hlciIgbGlmZWZvcm1zIGxpa2UgYW5pbWFscyBhbmQgdHlwaWNhbCBodW1hbnMpIHZhcmllZCBpbiB0aGVpciBtZWFuIF9IRUFSVF8gc2NvcmVzLiBBcyBpbiB0aGUgQk9EWSB2cy4gSEVBUlQgY29tcGFyaXNvbiBkaXNjdXNzZWQgZWFybGllciwgdGhpcyByYWlzZXMgdGhlIGludHJpZ3VpbmcgcG9zc2liaWxpdHkgdGhhdCBhdHRyaWJ1dGlvbnMgb2YgSEVBUlQgYW5kIE1JTkQgbWF5IGhhdmUgYmVlbiBnb3Zlcm5lZCBieSBzb21lIHNvcnQgb2YgInRocmVzaG9sZCIgbW9kZWwsIGluIHdoaWNoIGF0dHJpYnV0aW9ucyBvZiBhbnkgc3Vic3RhbnRpYWwgYW1vdW50IG9mIEhFQVJUIGRlcGVuZCBvbiB0aGUgdGFyZ2V0IGNoYXJhY3RlciBoYXZpbmcgYSBjZXJ0YWluIGRlZ3JlZSBvZiBNSU5ELgoKIyMjIyBBbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKSGVyZSBJIHByb3ZpZGUgYSBmb3JtYWwgYW5hbHlzaXMgb2YgdGhlIGFzeW1tZXRyaWVzIHJldmVhbGVkIGJ5IHRoZSB2aXN1YWxpemF0aW9ucyBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4gQXMgaW4gU3R1ZGllcyAxYS0xYywgZm9yIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzLCBJIGNvbmR1Y3QgYSBCYXllc2lhbiByZWdyZXNzaW9uIHRvIGNvbXBhcmUgZGlmZmVyZW5jZSBzY29yZXMgdG8gemVybywgY29udHJvbGxpbmcgZm9yIGRpZmZlcmVuY2VzIGluIGFzc2Vzc21lbnRzIG9mIHRoZSAyMSAiZGl2ZXJzZSBjaGFyYWN0ZXJzIiB0aGF0IHdlcmUgZmVhdHVyZWQgYXMgdGFyZ2V0IGNoYXJhY3RlcnMgaW4gdGhlc2Ugc3R1ZGllcy4gU2VlIEZpZ3VyZSA0LjIsIHBhbmVsIEQsIGZvciB2aXN1YWwgZGVwaWN0aW9ucyBvZiB0aGVzZSBkaWZmZXJlbmNlIHNjb3Jlcy4KCmBgYHtyfQojIGZpZ3VyZSBkb25lIGFib3ZlCmBgYAoKYGBge3J9CiMgcl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkMWRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpyX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkMWRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpyX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnN1bW1hcnkocl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDFkX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKcl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnN1bW1hcnkocl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCkKYGBgCgpgYGB7cn0KcmVndGFiX2QxZF9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX3JlZ190YWJsZV9mdW4oCiAgcmVnX2xpc3QgPSBsaXN0KHJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiAgICAgICAgICAgICAgICAgIHJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKICAgICAgICAgICAgICAgICAgcl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCksCiAgcGFpcl9saXN0ID0gYygiQk9EWSAtIEhFQVJUIiwgIkJPRFkgLSBNSU5EIiwgIkhFQVJUIC0gTUlORCIpLAogIHN0dWR5X25hbWUgPSAiU3R1ZHkgMWQiLAogIGNoYXJfbGFiZWwgPSBjKCJBZHVsdCB2cy4gR00iLCAiQ2hpbGQgdnMuIEdNIiwgIkluZmFudCB2cy4gR00iLCAiUFZTIHZzLiBHTSIsIAogICAgICAgICAgICAgICAgICJGZXR1cyB2cy4gR00iLCAiQ2hpbXBhbnplZSB2cy4gR00iLCAiRWxlcGhhbnQgdnMuIEdNIiwgCiAgICAgICAgICAgICAgICAgIkRvbHBoaW4gdnMuIEdNIiwgIkJlYXIgdnMuIEdNIiwgIkRvZyB2cy4gR00iLCAiR29hdCB2cy4gR00iLCAKICAgICAgICAgICAgICAgICAiTW91c2UgdnMuIEdNIiwgIkZyb2cgdnMuIEdNIiwgIkJsdWUgamF5IHZzLiBHTSIsICJGaXNoIHZzLiBHTSIsIAogICAgICAgICAgICAgICAgICJCZWV0bGUgdnMuIEdNIiwgIk1pY3JvYmUgdnMuIEdNIiwgIlJvYm90IHZzLiBHTSIsIAogICAgICAgICAgICAgICAgICJDb21wdXRlciB2cy4gR00iLCAiQ2FyIHZzLiBHTSIpKQpgYGAKCmBgYHtyfQpyZWd0YWJfc3R1ZHkxZCA8LSByZWd0YWJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmICU+JQogIG11dGF0ZV9hdCh2YXJzKGIsIHMuZS4pLAogICAgICAgICAgICBmdW5zKGZvcm1hdChyb3VuZCguLCBkaWdpdHMgPSAyKSwgbnNtYWxsID0gMikpKSAlPiUKICB1bml0ZShyZXN1bHQsIGIsIHMuZS4sIENJOTUsIG5vbnplcm8pICU+JQogIHNwcmVhZChzdHVkeSwgcmVzdWx0KSAlPiUKICBzZXBhcmF0ZShgU3R1ZHkgMWRgLCBjKCJzMWRfYiIsICJzMWRfcy5lLiIsICJzMWRfOTUlIENJIiwgInMxZF9ueiIpLCBzZXAgPSAiXyIpCmBgYAoKYGBge3J9CiMgaW50ZXJpbSB0YWJsZSBmb3IgZWFzZSBvZiB3cml0aW5nCnJlZ3RhYl9zdHVkeTFkICU+JQogIHNlbGVjdCgtZW5kc193aXRoKCJzLmUuIikpICU+JQogIGZpbHRlcihwYXJhbSA9PSAiSW50ZXJjZXB0IikgJT4lCiAga2FibGUoZGlnaXRzID0gMikgJT4lCiAga2FibGVfc3R5bGluZygpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKcGxvdF9kMWRfYWRfc2NvcmVkX2FkX2RpZmYKYGBgCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKVGhlc2UgcmVncmVzc2lvbiBhbmFseXNlcyBjb25maXJtZWQgdGhhdCBpbiBTdHVkeSAxZCwgYXMgaW4gU3R1ZGllcyAxYS0xYywgX0JPRFlfIHZzLiBfSEVBUlRfIGRpZmZlcmVuY2Ugc2NvcmVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9CT0RZXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0hFQVJUXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjMpLiAKClRoaXMgYXN5bW1ldHJ5IHdhcyBtb3JlIHByb25vdW5jZWQgZm9yIHNvbWUgY2hhcmFjdGVycywgYW5kIGxlc3MgcHJvbm91bmNlZCBmb3Igb3RoZXJz4oCUbmFtZWx5LCBodW1hbnMgKHdobyBnZW5lcmFsbHkgcmVjZWl2ZWQgaGlnaCBzY29yZXMgb24gYm90aCB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcykgYW5kIHRlY2hub2xvZ2llcyAod2hvIGdlbmVyYWxseSByZWNlaXZlZCBsb3cgc2NvcmVzIG9uIGJvdGggdGhlIF9CT0RZXyBhbmQgX0hFQVJUXyBzY2FsZXMpLiBBIGZ1bGwgZGlzY3Vzc2lvbiBvZiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyBpcyBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgY2hhcHRlciwgYnV0IGl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IHRoZXJlIHdlcmUgbm8gY2hhcmFjdGVycyBmb3Igd2hvbSB0aGlzIGFzeW1tZXRyeSB3YXMgc3lzdGVtYXRpY2FsbHkgcmV2ZXJzZWQgKGkuZS4sIHdobyB3ZXJlIGdlbmVyYWxseSBjb25zaWRlcmVkIHRvIGhhdmUgbW9yZSBIRUFSVCB0aGFuIEJPRFkgY2FwYWNpdGllcykuIFNlZSBGaWd1cmUgNC4yLCBwYW5lbCBELCBhbmQgdGhlIHZhcmlvdXMgY29tcGFyaXNvbnMgb2YgdGFyZ2V0IGNoYXJhY3RlcnMgdG8gdGhlIGdyYW5kIG1lYW4gZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjMuCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpUaGVzZSByZWdyZXNzaW9uIGFuYWx5c2VzIGluZGljYXRlZCB0aGF0IGluIFN0dWR5IDFkLCBpbiBjb250cmFzdCB0byBTdHVkaWVzIDFhLTFjLCBfQk9EWV8gdnMuIF9NSU5EXyBkaWZmZXJlbmNlIHNjb3JlcyB3ZXJlIG9ubHkgdmVyeSBzbGlnaHRseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9NSU5EXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0JPRFlfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJCT0RZLU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC4zKS4KCkFnYWluLCB0aGlzIGFzeW1tZXRyeSB3YXMgbW9yZSBwcm9ub3VuY2VkIGZvciBzb21lIGNoYXJhY3RlcnPigJRuYW1lbHksIHRlY2hub2xvZ2llcyAod2hvIGdlbmVyYWxseSByZWNlaXZlZCBoaWdoIHNjb3JlcyBvbiB0aGUgX01JTkRfIHNjYWxlIGFuZCBsb3cgc2NvcmVzIG9uIHRoZSBfQkRPWV8gc2NhbGUp4oCUYW5kIGxlc3MgcHJvbm91bmNlZCBmb3Igb3RoZXJzLiBJbmRlZWQsIHRoZXJlIHdlcmUgc29tZSBjaGFyYWN0ZXJzIChlLmcuLCB0aGUgY2hpbGQsIHRoZSBpbmZhbnQsIHRoZSBmZXR1cywgYW5kIGEgaGFuZGZ1bCBvZiBub24taHVtYW4gYW5pbWFscykgZm9yIHdob20gdGhpcyBhc3ltbWV0cnkgdGVuZGVkIHRvIHJ1biBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLCB3aXRoIHBhcnRpY2lwYW50cyBhdHRyaWJ1dGluZyBtb3JlIEJPRFkgdGhhbiBNSU5EIGNhcGFjaXRpZXMuIFNlZSBGaWd1cmUgNC4yLCBwYW5lbCBELCBhbmQgdGhlIHZhcmlvdXMgY29tcGFyaXNvbnMgb2YgdGFyZ2V0IGNoYXJhY3RlcnMgdG8gdGhlIGdyYW5kIG1lYW4gZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuMy4KCiMjIyMjIEhFQVJUIHZzLiBNSU5ECgpUaGVzZSByZWdyZXNzaW9uIGFuYWx5c2VzIGNvbmZpcm1lZCB0aGF0IGluIFN0dWR5IDFkLCBhcyBpbiBTdHVkaWVzIDFhLTFjLCBfSEVBUlRfIHZzLiBfTUlORF8gZGlmZmVyZW5jZSBzY29yZXMgd2VyZSBzdWJzdGFudGlhbGx5IG5vbi16ZXJvLCBpbiB0aGUgZGlyZWN0aW9uIG9mIHBhcnRpY2lwYW50cyBlbmRvcnNpbmcgX01JTkRfIGl0ZW1zIG1vcmUgc3Ryb25nbHkgdGhhbiBfSEVBUlRfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuMykuCgpTaW1pbGFyIHRvIHRoZSBCT0RZIHZzLiBIRUFSVCBjb21wYXJpc29uLCB0aGlzIGFzeW1tZXRyeSB3YXMgbGVzcyBwcm9ub3VuY2VkIGZvciBodW1hbnMgKHdobyBnZW5lcmFsbHkgcmVjZWl2ZWQgaGlnaCBzY29yZXMgb24gYm90aCB0aGUgX0hFQVJUXyBhbmQgX01JTkRfIHNjYWxlcyksIGFuZCBtb3JlIHByb25vdW5jZWQgZm9yIG90aGVyIGNoYXJhY3RlcnMuIEEgZnVsbCBkaXNjdXNzaW9uIG9mIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBjaGFwdGVyLCBidXQgaXQgaXMgd29ydGggbm90aW5nIHRoYXQgdGhlcmUgd2VyZSBubyBjaGFyYWN0ZXJzIGZvciB3aG9tIHRoaXMgYXN5bW1ldHJ5IHdhcyBzeXN0ZW1hdGljYWxseSByZXZlcnNlZCAoaS5lLiwgd2hvIHdlcmUgZ2VuZXJhbGx5IGNvbnNpZGVyZWQgdG8gaGF2ZSBtb3JlIEhFQVJUIHRoYW4gTUlORCBjYXBhY2l0aWVzKS4gU2VlIEZpZ3VyZSA0LjIsIHBhbmVsIEQsIGFuZCB0aGUgdmFyaW91cyBjb21wYXJpc29ucyBvZiB0YXJnZXQgY2hhcmFjdGVycyB0byB0aGUgZ3JhbmQgbWVhbiBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuMy4KCiMjIyMgSW50ZXJpbSBkaXNjdXNzaW9uCgpJbiBTdHVkeSAxZCwgbWFueSBvZiB0aGUgcmVzdWx0cyBvYnRhaW5lZCBpbiBTdHVkaWVzIDFhLTFjIHdlcmUgdXBoZWxkLiBJbiBwYXJ0aWN1bGFyLCAoMSkgVGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBCT0RZIHZzLiBIRUFSVCBhbmQgYmV0d2VlbiBNSU5EIHZzLiBIRUFSVCBhcHBlYXIgdG8gYmUgcG9zaXRpdmUsIHN1Y2ggdGhhdCB0aGUgbW9yZSBzdHJvbmdseSBhIHBhcnRpY2lwYW50IGVuZG9yc2VkIG9uZSBjb25jZXB0dWFsIHVuaXQsIHRoZSBtb3JlIHN0cm9uZ2x5IHRoZXkgdGVuZGVkIHRvIGVuZG9yc2UgdGhlIG90aGVyOyBhbmQgKDIpIFRoZXJlIGFwcGVhciB0byBiZSByb2J1c3QgYXN5bW1ldHJpZXMgaW4gdGhlc2UgcG9zaXRpdmUgcmVsYXRpb25zaGlwcywgc3VjaCB0aGF0IHBhcnRpY2lwYW50cyB0ZW5kZWQgdG8gZW5kb3JzZSBib3RoIEJPRFkgb3IgTUlORCBtb3JlIHN0cm9uZ2x5IHRoYW4gSEVBUlQuIAoKVmlzdWFsIGluc3BlY3Rpb24gb2YgdGhlIEJPRFkgdnMuIE1JTkQgc2NhdHRlcnBsb3QgZm9yIFN0dWR5IDFkIHN1Z2dlc3RzIHRoYXQgdGhpcyByZWxhdGlvbnNoaXAgd2FzIHF1aXRlIHZhcmlhYmxlIGFjcm9zcyBwYXJ0aWNpcGFudHMgYW5kIGFjcm9zcyB0YXJnZXQgY2hhcmFjdGVyc+KAlGV2ZW4gbW9yZSB2YXJpYWJsZSBhbmQgbGVzcyByb2J1c3QgdGhhbiB3aGF0IHdhcyBvYnNlcnZlZCBpbiBTdHVkaWVzIDFhLTFjLgoKRm9ybWFsIGFuYWx5c2VzIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGFjcm9zcyB0aGUgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyBpbiBTdHVkeSAxZCBjb25maXJtZWQgdGhlc2UgaW5mb3JtYWwgb2JzZXJ2YXRpb25zOiBQYXJ0aWNpcGFudHMgdGVuZGVkIHRvIGVuZG9yc2UgYm90aCBCT0RZIGFuZCBNSU5EIG1vcmUgc3Ryb25nbHkgdGhhbiBIRUFSVC4gSW4gdGhlIGFnZ3JlZ2F0ZSwgdGhlcmUgd2FzIGEgc2xpZ2h0IHRlbmRlbmN5IGZvciBwYXJ0aWNpcGFudHMgdG8gZW5kb3JzZSBNSU5EIG1vcmUgc3Ryb25nbHkgdGhhbiBCT0RZLCBidXQgdGhpcyBhc3ltbWV0cnkgd2FzIHdlYWsgYW5kIGhpZ2hseSBjb250aW5nZW50IG9uIHRoZSBwYXJ0aWN1bGFyIHRhcmdldCBjaGFyYWN0ZXIgdGhhdCBwYXJ0aWNpcGFudHMgd2VyZSBhc3NpZ25lZCB0byBhc3Nlc3MuCgpgYGB7cn0KdGFibGU0LjMgPC0gcmVndGFiX3N0dWR5MWQgJT4lCiAgc2VsZWN0KC1wYWlyLCAtZW5kc193aXRoKCJfcy5lLiIpKSAlPiUKICByZW5hbWUoUGFyYW1ldGVyID0gcGFyYW0pICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJueiIsICIgIiwgLikpKSAlPiUKICByZW5hbWVfYWxsKGZ1bnMoZ3N1YigiczEuXyIsICIiLCAuKSkpICU+JQogIGthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKGMocmVwKCJyIiwgMiksICJsIiksIDMpKSwgCiAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSA0LjM6IFJlZ3Jlc3Npb24gYW5hbHlzZXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgZm9yIFVTIGFkdWx0cyBpbiBTdHVkeSAxZC4gVGhlIHRhYmxlIHByZXNlbnRzIHJlc3VsdHMgZnJvbSBzZXBhcmF0ZSBCYXllc2lhbiByZWdyZXNzaW9ucyBvZiBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyAoQk9EWSB2cy4gSEVBUlQsIEJPRFkgdnMuIE1JTkQsIGFuZCBIRUFSVCB2cy4gTUlORCkuIEVhY2ggcmVncmVzc2lvbiBpbmNsdWRlZCB0d28gZml4ZWQgZWZmZWN0IHBhcmFtZXRlcnM6ICgxKSB0aGUgaW50ZXJjZXB0LCB3aGljaCBJIHRyZWF0IGFzIGFuIGluZGV4IG9mIHRoZSBhc3ltbWV0cnkgaW4gYXR0cmlidXRpb25zIG9mIHRoZSB0d28gY29uY2VwdHVhbCB1bml0cyBpbiBxdWVzdGlvbjsgYW5kICgyKSBhIGRpZmZlcmVuY2UgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycywgcmVwb3J0ZWQgaGVyZSBhcyBhIGRpZmZlcmVuY2UgYmV0d2VlbiBlYWNoIGNoYXJhY3RlciBhbmQgdGhlIGdyYW5kIG1lYW4gKEdNKS4gSW50ZXJjZXB0cyBhcmUgaGlnaGxpZ2h0ZWQgaW4gYm9sZCwgYmVjYXVzZSB0aGVzZSBhcmUgdGhlIHByaW1hcnkgcGFyYW1ldGVycyBvZiBpbnRlcmVzdCBmb3IgdGhlc2UgYW5hbHlzZXMuIEZvciBlYWNoIHBhcmFtZXRlciwgdGhlIHRhYmxlIGluY2x1ZGVzIHRoZSBlc3RpbWF0ZSAoYikgYW5kIGEgOTUlIGNyZWRpYmxlIGludGVydmFsIGZvciB0aGF0IGVzdGltYXRlLiBBc3Rlcmlza3MgaW5kaWNhdGUgOTUlIGNyZWRpYmxlIGludGVydmFscyB0aGF0IGRvIG5vdCBpbmNsdWRlIDAuIikgJT4lICAKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgcm93X3NwZWMoYygxLCAyMiwgNDMpLCBib2xkID0gVCkgJT4lCiAgZ3JvdXBfcm93cygiQk9EWSAtIEhFQVJUIiwgMSwgMjEpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBNSU5EIiwgMjIsIDQyKSAlPiUKICBncm91cF9yb3dzKCJIRUFSVCAtIE1JTkQiLCA0MywgNjMpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLAogICAgICAgICAgICAgICAgICAgICAiU3R1ZHkgMWQiID0gMykpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQp0YWJsZTQuMwpgYGAKCiMjIERpc2N1c3Npb24KClN0dWRpZXMgMWEtMWQgY29udmVyZ2UgdG8gc3VnZ2VzdCB0aGF0LCBhbW9uZyBVUyBhZHVsdHMsIHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIEJPRFksIEhFQVJULCBhbmQgTUlORCwgYXJlIGNoYXJhY3Rlcml6ZWQgYnkgYmVpbmcgKDEpIHBvc2l0aXZlLCBzdWNoIHRoYXQgdGhlIG1vcmUgc3Ryb25nbHkgYSBwYXJ0aWNpcGFudCBlbmRvcnNlZCBvbmUgY29uY2VwdHVhbCB1bml0LCB0aGUgbW9yZSBzdHJvbmdseSB0aGV5IHRlbmRlZCB0byBlbmRvcnNlIHRoZSBvdGhlcjsgYW5kICgyKSBhc3ltbWV0cmljYWwsIHN1Y2ggdGhhdCBjZXJ0YWluIGNvbmNlcHR1YWwgdW5pdHMgYXJlIHN5c3RlbWF0aWNhbGx5IGVuZG9yc2VkIG1vcmUgc3Ryb25nbHkgdGhhbiBvdGhlcnMuIEluIHBhcnRpY3VsYXIsIHRoZSB2YXN0IG1ham9yaXR5IG9mIHBhcnRpY2lwYW50cyBhY3Jvc3MgYWxsIGZvdXIgb2YgdGhlc2Ugc3R1ZGllcyBlbmRvcnNlZCBib3RoIEJPRFkgYW5kIE1JTkQgYXQgbGVhc3QgYXMgc3Ryb25nbHksIGFuZCBvZnRlbiBtb3JlIHN0cm9uZ2x5LCB0aGFuIHRoZXkgZW5kb3JzZWQgSEVBUlQsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggdGFyZ2V0IGNoYXJhY3RlciB0aGV5IHdlcmUgYXNzZXNzaW5nIG9yIGhvdyBzdHJvbmcgdGhlaXIgZW5kb3JzZW1lbnRzIHdlcmUgaW4gYWJzb2x1dGUgdGVybXMuIFRha2VuIHRvZ2V0aGVyLCBJIGNvbnNpZGVyIHRoaXMgdG8gYmUgZmFpcmx5IHN0cm9uZyBldmlkZW5jZSB0aGF0IHRoZSBjb25jZXB0dWFsIHVuaXRzIHRoYXQgSSBoYXZlIGNhbGxlZCBCT0RZIGFuZCBNSU5EIGFyZSBtb3JlIGJhc2ljIG9yIGZ1bmRhbWVudGFsIHRoYW4gdGhlIHVuaXQgdGhhdCBJIHJlZmVyIHRvIGFzIEhFQVJULgoKVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZXNlIHR3byBtb3JlICJiYXNpYyIgY29uY2VwdHVhbCB1bml0cyBhcHBlYXJzIHRvIGJlIG1vcmUgY29tcGxpY2F0ZWQuIEFjcm9zcyBTdHVkaWVzIDFhLTFkLCBpbiB0aGUgYWdncmVnYXRlIHBhcnRpY2lwYW50cyB0ZW5kZWQgdG8gZW5kb3JzZSBNSU5EIChzbGlnaHRseSkgbW9yZSBzdHJvbmdseSB0aGFuIEJPRFkuIEhvd2V2ZXIsIGluIGVhY2ggc3R1ZHkgdGhpcyBhc3ltbWV0cnkgd2FzIGRyaXZlbiBieSBhc3Nlc3NtZW50cyBvZiBhIHBhcnRpY3VsYXIga2luZCBvZiB0YXJnZXQgY2hhcmFjdGVyOiB0ZWNobm9sb2dpZXMgKHRoZSByb2JvdCBpbiBTdHVkaWVzIDFhLTFjOyB0aGUgcm9ib3QsIGNvbXB1dGVyLCBhbmQgY2FyIGluIFN0dWR5IDFkKS4gRm9yIG90aGVyIHRhcmdldCBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgdGhlIGJlZXRsZSBpbiBTdHVkaWVzIDFhLTFjLCBhcyB3ZWxsIGFzIG1hbnkgb2YgdGhlIHRhcmdldCBjaGFyYWN0ZXJzIGluIFN0dWR5IDFkKSwgYXZlcmFnZSBkaWZmZXJlbmNlIHNjb3JlcyBob3ZlcmVkIGFyb3VuZCB6ZXJvLCB3aXRoIHNvbWUgcGFydGljaXBhbnRzIGVuZG9yc2luZyBCT0RZIG1vcmUgc3Ryb25nbHkgdGhhbiBNSU5ELCBvdGhlcnMgZW5kb3JzaW5nIE1JTkQgbW9yZSBzdHJvbmdseSB0aGFuIEJPRFksIGFuZCBzdGlsbCBvdGhlcnMgZW5kb3JzaW5nIEJPRFkgYW5kIE1JTkQgdG8gcm91Z2hseSBlcXVhbCBkZWdyZWVzLiBJbiBTdHVkeSAxZCB0aGVyZSB3ZXJlIGV2ZW4gYSBmZXcgdGFyZ2V0IGNoYXJhY3RlcnPigJRuYW1lbHksIGltbWF0dXJlIGh1bWFucyBhbmQgYSBoYW5kZnVsIG9mIG5vbi1odW1hbiBhbmltYWxz4oCUZm9yIHdob20gZGlmZmVyZW5jZSBzY29yZXMgc3lzdGVtYXRpY2FsbHkgcmFuIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24gdG8gd2hhdCB3YXMgb2JzZXJ2ZWQgYW1vbmcgdGVjaG5vbG9naWVzLCB3aXRoIHBhcnRpY2lwYW50cyBlbmRvcnNpbmcgQk9EWSBtb3JlIHN0cm9uZ2x5IHRoYW4gTUlORC4gVGFrZW4gdG9nZXRoZXIsIHRoZXNlIG9ic2VydmF0aW9ucyBzdWdnZXN0IHRoYXQgYXN5bW1ldHJpZXMgaW4gYXR0cmlidXRpb25zIG9mIEJPRFkgdnMuIE1JTkQgYXJlIG1vcmUgdmFyaWFibGUgYWNyb3NzIGluZGl2aWR1YWwgcGFydGljaXBhbnRzIGFuZCBtb3JlIHNlbnNpdGl2ZSB0byBkaWZmZXJlbmNlcyBpbiB0YXJnZXQgY2hhcmFjdGVyc+KAlGFuZCwgYnkgZXh0ZW5zaW9uLCB0aGF0IHRoZXJlIGlzIG5vIGdlbmVyYWwgb3Igcm9idXN0IGhpZXJhcmNoaWNhbCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVzZSB0d28gY29uY2VwdHVhbCB1bml0cyBpbiBVUyBhZHVsdHMnIGNvbmNlcHR1YWwgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlLgoKCiMgU3R1ZHkgMjogQ29uY2VwdHVhbCBjaGFuZ2UgYmV0d2VlbiBtaWRkbGUgY2hpbGRob29kICg3LTl5KSBhbmQgYWR1bHRob29kCgpJbiB0aGUgY29udGV4dCBvZiB0aGlzIGRpc3NlcnRhdGlvbiwgU3R1ZHkgMiBzZXJ2ZXMgdG8gcHJvdmlkZSBhbiBpbml0aWFsIGludmVzdGlnYXRpb24gb2YgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlIGVhcmxpZXIgaW4gZGV2ZWxvcG1lbnQsIGluIHdoYXQgSSBoYXZlIGNhbGxlZCBtaWRkbGUgY2hpbGRob29kICg3LTl5KS4gSW4gdGhpcyBjaGFwdGVyLCBJIGZvY3VzIG9uIHdoYXQgdGhpcyBzdHVkeSBjYW4gcmV2ZWFsIGFib3V0IGNoYW5nZXMgaW4gdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlIGNvbmNlcHR1YWwgdW5pdHMgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIGJldHdlZW4gbWlkZGxlIGNoaWxkaG9vZCBhbmQgYWR1bHRob29kLgoKSW4gU3R1ZHkgMiwgYHIgbnJvdyhkMl9hZF93aWRlKWAgVVMgYWR1bHRzIGFuZCBgciBucm93KGQyXzc5X3dpZGUpYCBVUyBjaGlsZHJlbiBiZXR3ZWVuIHRoZSBhZ2VzIG9mIGByIHN1bW1hcnkoZDJfNzkkYWdlKVsiTWluLiJdICU+JSByb3VuZCgyKSAlPiUgZm9ybWF0KG5zbWFsbCA9IDIpYC1gciBzdW1tYXJ5KGQyXzc5JGFnZSlbIk1heC4iXSAlPiUgcm91bmQoMikgJT4lIGZvcm1hdChuc21hbGwgPSAyKWAgeWVhcnMgKG1lZGlhbjogYHIgc3VtbWFyeShkMl83OSRhZ2UpWyJNZWRpYW4iXSAlPiUgcm91bmQoMikgJT4lIGZvcm1hdChuc21hbGwgPSAyKWB5KSBlYWNoIGFzc2Vzc2VkIGEgc2luZ2xlIHRhcmdldCBjaGFyYWN0ZXIgb24gNDAgbWVudGFsIGNhcGFjaXRpZXMuIFRoaXMgc3R1ZHkgZW1wbG95ZWQgdGhlICJlZGdlIGNhc2UiIHZhcmlhbnQgb2YgdGhlIGdlbmVyYWwgYXBwcm9hY2gsIHdpdGggcGFydGljaXBhbnRzIHJhbmRvbWx5IGFzc2lnbmVkIHRvIGFzc2VzcyBlaXRoZXIgYSBiZWV0bGUgb3IgYSByb2JvdC4gKFNlZSBDaGFwdGVyIElJIGZvciBkZXRhaWxlZCBtZXRob2RzLikKCiMjIFJlc3VsdHMKCiMjIyBBZHVsdHMKCiMjIyMgU2NhbGUgY29uc3RydWN0aW9uCgpgYGB7cn0Kc2NhbGVzX2VmYV93ZG1fZDJfYWQgPC0gc2NhbGVfZnVuKGVmYV93ZG1fZDJfYWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2VmYV93ZG1fZDJfYWQpCmQyX2FkX3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDJfYWQsIHNjYWxlc19lZmFfd2RtX2QyX2FkKQoKc2F2ZVJEUyhzY2FsZXNfZWZhX3dkbV9kMl9hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY2FsZXMvc2NhbGVzX2VmYV93ZG1fZDJfYWQiKQpzYXZlUkRTKGQyX2FkX3Njb3JlZF9hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY29yZWRfZGF0YS9kMl9hZF9zY29yZWRfYWQiKQpgYGAKCmBgYHtyfQojIGJpZyB0YWJsZSBmb3Igc2NhbGVzIGxvY2F0ZWQgYXQgc3R1ZHkgNApgYGAKCkZvbGxvd2luZyB0aGUgc3RlcHMgZGVzY3JpYmVkIGluIHRoZSAiR2VuZXJhbCBhbmFseXNpcyBwbGFuLCIgYWJvdmUsIHlpZWxkZWQgYHIgZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3dkbV9kMl9hZClgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3dkbV9kMl9hZCAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKClgIGl0ZW1zIGVhY2g7IHNlZSBUYWJsZSA0LjEwLgoKIyMjIyBWaXN1YWxpemF0aW9uIGFuZCBhbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKYGBge3J9CnBsb3RzX2QyX2FkX3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQyX2FkX3Njb3JlZF9hZCkKYGBgCgpgYGB7cn0KZmlnX2QyX2FkX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kMl9hZF9zY29yZWRfYWRbWzFdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QyX2FkX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QyX2FkX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlnX2QyX2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QyX2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKCmZpZ19kMl9hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kMl9hZF9wbG90cywgZmlnX2QyX2FkX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kMl9hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDI6IEFkdWx0cyIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDJfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDJfYWRfdGl0bGUsIGZpZ19kMl9hZF9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKZmlnX2QyX2FkX3Bsb3RzX2xlZ190aXRsZQpgYGAKClZpc3VhbGl6YXRpb25zIG9mIHJlbGF0aW9uc2hpcHMgYW1vbmcgc2NvcmVzIG9uIHRoZXNlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYXJlIHByb3ZpZGVkIGluIEZpZ3VyZSA0LjMsIHJvdyBBLiBIZXJlIEkgY29tYmluZSBteSBpbmZvcm1hbCBkZXNjcmlwdGlvbnMgb2YgdGhlc2UgdmlzdWFsaXphdGlvbnMgd2l0aCBmb3JtYWwgYW5hbHlzZXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBjb25jZXB0dWFsIHVuaXRzLCBjb250cm9sbGluZyBmb3IgZGlmZmVyZW5jZXMgaW4gYXNzZXNzbWVudHMgb2YgdGhlIHR3byAiZWRnZSBjYXNlcyIgdGhhdCB3ZXJlIGZlYXR1cmVkIGFzIHRhcmdldCBjaGFyYWN0ZXJzIGluIHRoZXNlIHN0dWRpZXMuIFNlZSBGaWd1cmUgNC41LCBwYW5lbCBBLCBmb3IgdmlzdWFsIGRlcGljdGlvbnMgb2YgdGhlc2UgZGlmZmVyZW5jZSBzY29yZXMsIGFuZCBUYWJsZSA0LjQgZm9yIHRoZSBmdWxsIHJlc3VsdHMgb2YgdGhlc2UgQmF5ZXNpYW4gcmVncmVzc2lvbiBhbmFseXNlcy4KCmBgYHtyfQpkMl9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX2Z1bihkMl9hZF9zY29yZWRfYWQpCmNvbnRyYXN0cyhkMl9hZF9zY29yZWRfYWRfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZWRnZQoKc2F2ZVJEUyhkMl9hZF9zY29yZWRfYWRfZGlmZiwgIi4vc3RvcmVkL2RpZmZzY29yZV9kYXRhL2QyX2FkX3Njb3JlZF9hZF9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kMl9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDJfYWRfc2NvcmVkX2FkX2RpZmYpCmBgYAoKYGBge3J9CiMgcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQyX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKc3VtbWFyeShyX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCkKYGBgCgpgYGB7cn0KcmVndGFiX2QyX2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kMl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKICAgICAgICAgICAgICAgICAgcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJBZHVsdHMiLAogIGNoYXJfbGFiZWwgPSAiUm9ib3QgdnMuIEdNIikKYGBgCgpgYGB7cn0KIyBpbnRlcmltIHRhYmxlIGZvciBlYXNlIG9mIHdyaXRpbmcKcmVndGFiX2QyX2FkX3Njb3JlZF9hZF9kaWZmICU+JQogIHNlbGVjdCgtc3R1ZHksIC1zLmUuKSAlPiUKICBmaWx0ZXIocGFyYW0gPT0gIkludGVyY2VwdCIpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCnBsb3RfZDJfYWRfc2NvcmVkX2FkX2RpZmYKYGBgCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKQXMgaW4gU3R1ZHkgMSwgYW1vbmcgYWR1bHRzIGluIFN0dWR5IDIgdGhlcmUgd2FzIGEgd2FzIGEgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzIChgciBzY29yZV9jb3JfcHJpbnRfZnVuKGQyX2FkX3Njb3JlZF9hZCwgIkJPRFkgdnMuIEhFQVJUIilgKS4gVGhlIHZpc3VhbGl6YXRpb24gb2YgdGhpcyByZWxhdGlvbnNoaXAgKEZpZ3VyZSA0LjMsIHBhbmVsIEExKSBmZWF0dXJlZCB2ZXJ5IGZldyBkYXRhcG9pbnRzIGFib3ZlIHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSnigJRhbiBhc3ltbWV0cnkgd2hpY2ggYXBwZWFyZWQgdG8gaGF2ZSBiZWVuIGRyaXZlbiBwcmltYXJpbHkgYnkgYXNzZXNzbWVudHMgb2YgdGhlIGJlZXRsZSAoaW4gcmVkKS4gQSByZWdyZXNzaW9uIGFuYWx5c2lzIGNvbmZpcm1lZCB0aGF0IGFkdWx0cycgX0JPRFlfIHZzLiBfSEVBUlRfIGRpZmZlcmVuY2Ugc2NvcmVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9CT0RZXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0hFQVJUXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjQpLCBhbmQgdGhpcyBhc3ltbWV0cnkgd2FzIGRyaXZlbiBwcmltYXJpbHkgYnkgcGFydGljaXBhbnRzJyBhc3Nlc3NtZW50cyBvZiB0aGUgYmVldGxlIChzZWUgdGhlICJSb2JvdCB2cy4gR00iIHJvdyBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNCkuCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpVbmxpa2UgU3R1ZHkgMSwgYW1vbmcgYWR1bHRzIGluIFN0dWR5IDIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIHdhcyBub3Qgc2lnbmlmaWNhbnRseSBwb3NpdGl2ZSAoYHIgc2NvcmVfY29yX3ByaW50X2Z1bihkMl9hZF9zY29yZWRfYWQsICJCT0RZIHZzLiBNSU5EIilgKS4gQXMgaW4gU3R1ZHkgMSwgdGhlIHZpc3VhbGl6YXRpb24gb2YgdGhpcyByZWxhdGlvbnNoaXAgKEZpZ3VyZSA0LjMsIHBhbmVsIEEyKSBmZWF0dXJlZCBmZXdlciBkYXRhcG9pbnRzIGJlbG93IHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSkgdGhhbiBhYm92ZSBpdCwgYW5kIG5vIGRhdGFwb2ludHMgaW4gdGhlIGxvd2VyIHJpZ2h0IGNvcm5lciBvZiB0aGUgcGxvdOKAlGFuIGFzeW1tZXRyeSB3aGljaCBhcHBlYXJlZCB0byBoYXZlIGJlZW4gZHJpdmVuIHByaW1hcmlseSBieSBhc3Nlc3NtZW50cyBvZiB0aGUgcm9ib3QgKGluIGJsdWUpIGFuZCB3aGljaCBnZW5lcmFsbHkgYXBwZWFyZWQgdG8gYmUgbGVzcyBleHRyZW1lIHRoYW4gdGhlIG90aGVyIHR3byBjb21wYXJpc29ucy4gQSByZWdyZXNzaW9uIGFuYWx5c2lzIGNvbmZpcm1lZCB0aGF0IGFkdWx0cycgX0JPRFlfIHZzLiBfTUlORF8gZGlmZmVyZW5jZSBzY29yZXMgd2VyZSBzdWJzdGFudGlhbGx5IG5vbi16ZXJvLCBpbiB0aGUgZGlyZWN0aW9uIG9mIHBhcnRpY2lwYW50cyBlbmRvcnNpbmcgX01JTkRfIGl0ZW1zIG1vcmUgc3Ryb25nbHkgdGhhbiBfQk9EWV8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjQpLCBhbmQgdGhpcyBhc3ltbWV0cnkgd2FzIGRyaXZlbiBwcmltYXJpbHkgYnkgcGFydGljaXBhbnRzJyBhc3Nlc3NtZW50cyBvZiB0aGUgcm9ib3QgKHNlZSB0aGUgIlJvYm90IHZzLiBHTSIgcm93IGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjQpLgoKIyMjIyMgSEVBUlQgdnMuIE1JTkQKCkFzIGluIFN0dWR5IDEsIGFtb25nIGFkdWx0cyBpbiBTdHVkeSAyIHRoZXJlIHdhcyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0hFQVJUXyBhbmQgX01JTkRfIHNjYWxlcyAoYHIgc2NvcmVfY29yX3ByaW50X2Z1bihkMl9hZF9zY29yZWRfYWQsICJIRUFSVCB2cy4gTUlORCIpYCkuIEFzIGluIFN0dWR5IDEsIHRoZSB2aXN1YWxpemF0aW9uIG9mIHRoaXMgcmVsYXRpb25zaGlwIChGaWd1cmUgNC4zLCBwYW5lbCBBMykgZmVhdHVyZWQgdmlydHVhbGx5IG5vIGRhdGFwb2ludHMgYmVsb3cgdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5ID0geCQsIGRvdHRlZCBkaWFnb25hbCBsaW5lKeKAlGFuIGFzeW1tZXRyeSB3aGljaCBhcHBlYXJlZCB0byBoYXZlIGJlZW4gZXNwZWNpYWxseSBleHRyZW1lLiBBIHJlZ3Jlc3Npb24gYW5hbHlzaXMgY29uZmlybWVkIHRoYXQgYWR1bHRzJyBfSEVBUlRfIHZzLiBfTUlORF8gZGlmZmVyZW5jZSBzY29yZXMgd2VyZSBzdWJzdGFudGlhbGx5IG5vbi16ZXJvLCBpbiB0aGUgZGlyZWN0aW9uIG9mIHBhcnRpY2lwYW50cyBlbmRvcnNpbmcgX01JTkRfIGl0ZW1zIG1vcmUgc3Ryb25nbHkgdGhhbiBfSEVBUlRfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNCk7IHRoaXMgYXN5bW1ldHJ5IHdhcyBzb21ld2hhdCBleGFnZ2VyYXRlZCBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgcm9ib3QgKHNlZSB0aGUgIlJvYm90IHZzLiBHTSIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC40KS4KCiMjIyMgSW50ZXJpbSBkaXNjdXNzaW9uCgpUaGUgcmVsYXRpb25zaGlwcyBhbW9uZyBhZHVsdHMnIGVuZG9yc2VtZW50cyBvZiB0aGUgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkeSAyIGFwcGVhciB0byBiZSB2ZXJ5IHNpbWlsYXIgdG8gdGhvc2UgcmV2ZWFsZWQgYnkgU3R1ZHkgMTogKDEpIFdpdGggdGhlIGV4Y2VwdGlvbiBvZiBCT0RZIHZzLiBNSU5ELCB0aGVzZSBpbnRlci11bml0IHJlbGF0aW9uc2hpcHMgd2VyZSBwb3NpdGl2ZSwgc3VjaCB0aGF0IHRoZSBtb3JlIHN0cm9uZ2x5IGEgcGFydGljaXBhbnQgZW5kb3JzZWQgb25lIGNvbmNlcHR1YWwgdW5pdCwgdGhlIG1vcmUgc3Ryb25nbHkgdGhleSB0ZW5kZWQgdG8gZW5kb3JzZSB0aGUgb3RoZXJzOyBhbmQgKDIpIFRoZXJlIHdlcmUgcm9idXN0IGFzeW1tZXRyaWVzIGluIHRoZXNlIHBvc2l0aXZlIHJlbGF0aW9uc2hpcHMsIHN1Y2ggdGhhdCBwYXJ0aWNpcGFudHMgdGVuZGVkIHRvIGVuZG9yc2UgTUlORCBtb3JlIHN0cm9uZ2x5IHRoYW4gQk9EWSBvciBIRUFSVCwgYW5kIEhFQVJUIG1vcmUgc3Ryb25nbHkgdGhhbiBNSU5ELiBUaGVzZSBhc3ltbWV0cmllcyB3ZXJlIHBhcnRpY3VsYXJseSBwcm9ub3VuY2VkIGZvciBjb21wYXJpc29ucyBpbnZvbHZpbmcgSEVBUlQsIHdpdGggdmlydHVhbGx5IGV2ZXJ5IHBhcnRpY2lwYW50IGFjcm9zcyBhbGwgdGhyZWUgb2YgdGhlc2Ugc3R1ZGllcyBlbmRvcnNpbmcgYm90aCBCT0RZIGFuZCBNSU5EIG1vcmUgc3Ryb25nbHkgdGhhbiBIRUFSVCBmb3IgYm90aCBvZiB0aGUgImVkZ2UgY2FzZSIgY2hhcmFjdGVycyBpbmNsdWRlZCBpbiB0aGVzZSBzdHVkaWVzIChhIGJlZXRsZSBhbmQgYSByb2JvdCkuIEZvcm1hbCBhbmFseXNlcyBvZiBkaWZmZXJlbmNlIHNjb3JlcyBhY3Jvc3MgdGhlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYW1vbmcgYWR1bHRzIGluIFN0dWR5IDIgY29uZmlybSB0aGVzZSBpbmZvcm1hbCBvYnNlcnZhdGlvbnMuCgpUaGUgc2ltaWxhcml0eSBpbiByZXN1bHRzIGFtb25nIGFkdWx0cyBpbiBTdHVkaWVzIDEgYW5kIDIgb2ZmZXJzIGZ1cnRoZXIgZXZpZGVuY2UgdGhhdCB0aGlzIGNvbmNlcHR1YWwgb3JnYW5pemF0aW9uIGlzIHJvYnVzdCB0byBkaWZmZXJlbmNlcyBpbiBleHBlcmltZW50YWwgbWV0aG9kcywgaW5jbHVkaW5nIGRpZmZlcmVuY2VzIGluIHRoZSBzZXQgb2YgbWVudGFsIGNhcGFjaXRpZXMgYW5kIGluIHRoZSByZXNwb25zZSBzY2FsZXMgZW1wbG95ZWQgaW4gdGhlc2Ugc3R1ZGllcy4KCiMjIyBDaGlsZHJlbiAoNy05eSkKClRoZSBwcmltYXJ5IGdvYWwgb2YgU3R1ZHkgMiB3YXMgdG8gYmVnaW4gaW52ZXN0aWdhdGluZyB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhlc2UgY29uY2VwdHVhbCByZXByZXNlbnRhdGlvbnM6IFdoYXQgYXJlIHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIEJPRFksIEhFQVJULCBhbmQgTUlORCBhbW9uZyBjaGlsZHJlbiBhZ2VzIDctOXksIGFuZCBob3cgZG8gdGhlc2UgcmVsYXRpb25zaGlwcyBjb21wYXJlIHRvIHRob3NlIGFtb25nIGFkdWx0cywgYXMgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uPwoKSSBiZWdpbiBteSBleHBsb3JhdGlvbiBvZiB0aGlzIGFzcGVjdCBvZiBjb25jZXB0dWFsIGNoYW5nZSBieSBhcHBseWluZyB0aGUgc2FtZSBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzIChkZXJpdmVkIGZyb20gRUZBIG9mIGFkdWx0cycgcmVzcG9uc2VzKSB0byBjaGlsZHJlbidzIHJlc3BvbnNlcywgZXhhbWluaW5nIHRoZSBzYW1lIHZpc3VhbGl6YXRpb25zLCBhbmQgY29uZHVjdGluZyB0aGUgc2FtZSByZWdyZXNzaW9uIGFuYWx5c2VzLiBJIHRoZW4gY29uZHVjdCBhIGZvcm1hbCBjb21wYXJpc29uIG9mIGNoaWxkcmVuJ3MgYW5kIGFkdWx0cycgcmVzdWx0cyAoIkRldmVsb3BtZW50YWwgY29tcGFyaXNvbiIpLCBiZWZvcmUgYnJpZWZseSBjb25zaWRlcmluZyB3aGF0IHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gQk9EWSwgSEVBUlQsIGFuZCBNSU5EIG1pZ2h0IGxvb2sgbGlrZSBpZiB0aGV5IHdlcmUgaW5kZXhlZCBieSBzY2FsZXMgZGVyaXZlZCBmcm9tIEVGQSBvZiBjaGlsZHJlbidzLCByYXRoZXIgdGhhbiBhZHVsdHMnIHJlc3BvbnNlcyAoIkNoaWxkcmVuICg3LTl5KSwgdXNpbmcgY2hpbGRyZW4ncyBvd24gc2NhbGVzIikuIAoKYGBge3J9CmQyXzc5X3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDJfNzksIHNjYWxlc19lZmFfd2RtX2QyX2FkKQpzYXZlUkRTKGQyXzc5X3Njb3JlZF9hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY29yZWRfZGF0YS9kMl83OV9zY29yZWRfYWQiKQpgYGAKCiMjIyMgVmlzdWFsaXphdGlvbiBhbmQgYW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKClZpc3VhbGl6YXRpb25zIG9mIHJlbGF0aW9uc2hpcHMgYW1vbmcgc2NvcmVzIG9uIHRoZXNlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYXJlIHByb3ZpZGVkIGluIEZpZ3VyZSA0LjMsIHJvdyBCLiBIZXJlIEkgY29tYmluZSBteSBpbmZvcm1hbCBkZXNjcmlwdGlvbnMgb2YgdGhlc2UgdmlzdWFsaXphdGlvbnMgd2l0aCBmb3JtYWwgYW5hbHlzZXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBjb25jZXB0dWFsIHVuaXRzLCBjb250cm9sbGluZyBmb3IgZGlmZmVyZW5jZXMgaW4gYXNzZXNzbWVudHMgb2YgdGhlIHR3byAiZWRnZSBjYXNlcyIgdGhhdCB3ZXJlIGZlYXR1cmVkIGFzIHRhcmdldCBjaGFyYWN0ZXJzIGluIHRoZXNlIHN0dWRpZXMuIFNlZSBGaWd1cmUgNC41LCBwYW5lbCBCLCBmb3IgdmlzdWFsIGRlcGljdGlvbnMgb2YgdGhlc2UgZGlmZmVyZW5jZSBzY29yZXMsIGFuZCBUYWJsZSA0LjQgZm9yIHRoZSBmdWxsIHJlc3VsdHMgb2YgdGhlc2UgQmF5ZXNpYW4gcmVncmVzc2lvbiBhbmFseXNlcy4KCmBgYHtyfQpwbG90c19kMl83OV9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkMl83OV9zY29yZWRfYWQpCmBgYAoKYGBge3J9CmZpZ19kMl83OV9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDJfNzlfc2NvcmVkX2FkW1sxXV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMl83OV9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMl83OV9zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCMSIsICJCMiIsICJCMyIpLCBuY29sID0gMykKCmZpZ19kMl83OV9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19kMl83OV9zY29yZWRfYWRbWzFdXSArIAogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkpCgpmaWdfZDJfNzlfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWdfZDJfNzlfcGxvdHMsIGZpZ19kMl83OV9sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDJfNzlfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAyOiBDaGlsZHJlbiwgNy05eSAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDJfNzlfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDJfNzlfdGl0bGUsIGZpZ19kMl83OV9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKZmlnX2QyXzc5X3Bsb3RzX2xlZ190aXRsZQpgYGAKCmBgYHtyfQpkMl83OV9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX2Z1bihkMl83OV9zY29yZWRfYWQpCmNvbnRyYXN0cyhkMl83OV9zY29yZWRfYWRfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZWRnZQoKc2F2ZVJEUyhkMl83OV9zY29yZWRfYWRfZGlmZiwgIi4vc3RvcmVkL2RpZmZzY29yZV9kYXRhL2QyXzc5X3Njb3JlZF9hZF9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kMl83OV9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDJfNzlfc2NvcmVkX2FkX2RpZmYpCmBgYAoKYGBge3J9CiMgcl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQyXzc5X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKcl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKc3VtbWFyeShyX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKcl9kMl83OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDJfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCkKYGBgCgpgYGB7cn0KcmVndGFiX2QyXzc5X3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKICAgICAgICAgICAgICAgICAgcl9kMl83OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJDaGlsZHJlbiwgNy05eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpIiwKICBjaGFyX2xhYmVsID0gIlJvYm90IHZzLiBHTSIpCmBgYAoKYGBge3J9CiMgaW50ZXJpbSB0YWJsZSBmb3IgZWFzZSBvZiB3cml0aW5nCnJlZ3RhYl9kMl83OV9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgZmlsdGVyKHBhcmFtID09ICJJbnRlcmNlcHQiKSAlPiUKICBrYWJsZShkaWdpdHMgPSAyKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpwbG90X2QyXzc5X3Njb3JlZF9hZF9kaWZmCmBgYAoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkFzIGFtb25nIGFkdWx0cyBpbiB0aGlzIHN0dWR5IChGaWd1cmUgNC4zLCBwYW5lbCBBMSksIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBjaGlsZHJlbidzIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcyAocGFuZWwgQjEpIHdhcyBwb3NpdGl2ZSAoYHIgc2NvcmVfY29yX3ByaW50X2Z1bihkMl83OV9zY29yZWRfYWQsICJCT0RZIHZzLiBIRUFSVCIpYCksIGFuZCB0aGVyZSBhcHBlYXIgdG8gYmUgc29tZXdoYXQgZmV3ZXIgZGF0YXBvaW50cyBhYm92ZSB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpIHRoYW4gYmVsb3cgaXQuIEhvd2V2ZXIsIHRoaXMgYXN5bW1ldHJ5IGlzIGxlc3Mgc3RyaWtpbmcgYW1vbmcgY2hpbGRyZW4gdGhhbiBpdCB3YXMgYW1vbmcgYWR1bHRzOiBXaGlsZSBtYW55IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBCT0RZIHRoYW4gSEVBUlQgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24gKGxpa2UgdGhlIHZhc3QgbWFqb3JpdHkgb2YgYWR1bHRzKSwgcXVpdGUgYSBmZXcgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIEhFQVJUIHRoYW4gQk9EWS4gSW5kZWVkLCBhIHJlZ3Jlc3Npb24gYW5hbHlzaXMgcmV2ZWFsZWQgdGhhdCBjaGlsZHJlbidzIEJPRFkgdnMuIEhFQVJUIGRpZmZlcmVuY2Ugc2NvcmVzIHdlcmUgbm90IHF1aXRlIGRpZmZlcmVudGlhYmxlIGZyb20gemVybyAodGhlIGxvd2VyIGJvdW5kIG9mIHRoZSA5NSUgY3JlZGlibGUgaW50ZXJ2YWwgd2FzIGVmZmVjdGl2ZWx5IHplcm87IHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC40KS4gTW9yZW92ZXIsIHRoZSBkaXJlY3Rpb24gb2YgZGlmZmVyZW5jZSB2YXJpZWQgc3Vic3RhbnRpYWxseSBhY3Jvc3MgdGFyZ2V0IGNoYXJhY3RlcnMgKHNlZSB0aGUgIlJvYm90IHZzLiBHTSIgcm93IGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC40KSwgd2l0aCBjaGlsZHJlbiB0ZW5kaW5nIHRvIGF0dHJpYnV0ZSBtb3JlIEJPRFkgdGhhbiBIRUFSVCB0byB0aGUgYmVldGxlIGJ1dCwgaWYgYW55dGhpbmcsIG1vcmUgSEVBUlQgdGhhbiBCT0RZIHRvIHRoZSByb2JvdC4KCiMjIyMjIEJPRFkgdnMuIE1JTkQKCkFzIGFtb25nIGFkdWx0cyBpbiB0aGlzIHN0dWR5IChGaWd1cmUgNC4zLCBwYW5lbCBBMiksIHRoZXJlIHdhcyBubyBzaWduaWZpY2FudCByZWxhdGlvbnNoaXAgYmV0d2VlbiBjaGlsZHJlbidzIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIChwYW5lbCBCMzsgYHIgc2NvcmVfY29yX3ByaW50X2Z1bihkMl83OV9zY29yZWRfYWQsICJCT0RZIHZzLiBNSU5EIilgKS4gSW4gdGhlIHZpc3VhbGl6YXRpb24gb2YgY2hpbGRyZW4ncyBzY29yZXMgdGhlcmUgYXBwZWFyIHRvIGJlIHNvbWV3aGF0IGZld2VyIGRhdGFwb2ludHMgYmVsb3cgdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5ID0geCQsIGRvdHRlZCBkaWFnb25hbCBsaW5lKSB0aGFuIGFib3ZlIGl0LCBidXQgdGhpcyBhc3ltbWV0cnkgaXMgbGVzcyBzdHJpa2luZyBhbW9uZyBjaGlsZHJlbiB0aGFuIGl0IHdhcyBhbW9uZyBhZHVsdHM6IFdoaWxlIG1hbnkgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIE1JTkQgdGhhbiBCT0RZIHRvIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGluIHF1ZXN0aW9uIChsaWtlIHRoZSB2YXN0IG1ham9yaXR5IG9mIGFkdWx0cyksIHF1aXRlIGEgZmV3IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBCT0RZIHRoYW4gTUlORC4gQSByZWdyZXNzaW9uIGFuYWx5c2lzIGNvbmZpcm1lZCB0aGF0LCBvbiB0aGUgd2hvbGUsIGNoaWxkcmVuJ3MgQk9EWSB2cy4gTUlORCBkaWZmZXJlbmNlIHNjb3JlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgY2hpbGRyZW4gZW5kb3JzaW5nIF9NSU5EXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0JPRFlfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJCT0RZLU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC40KSwgYnV0IHRoaXMgZGlmZmVyZW5jZSB2YXJpZWQgc3Vic3RhbnRpYWxseSBhY3Jvc3MgdGFyZ2V0IGNoYXJhY3RlcnMgKHNlZSB0aGUgIlJvYm90IHZzLiBHTSIgcm93IGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjQpLCB3aXRoIGNoaWxkcmVuIHRlbmRpbmcgdG8gYXR0cmlidXRlIG1vcmUgTUlORCB0aGFuIEJPRFkgdG8gdGhlIHJvYm90IGJ1dCwgaWYgYW55dGhpbmcsIG1vcmUgQk9EWSB0aGFuIE1JTkQgdG8gdGhlIGJlZXRsZS4KCiMjIyMjIEhFQVJUIHZzLiBNSU5ECgpBcyBhbW9uZyBhZHVsdHMgaW4gdGhpcyBzdHVkeSAoRmlndXJlIDQuMywgcGFuZWwgQTMpLCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gY2hpbGRyZW4ncyBzY29yZXMgb24gdGhlIF9IRUFSVF8gYW5kIF9NSU5EXyBzY2FsZXMgKHBhbmVsIEIzKSB3YXMgcG9zaXRpdmUgKGByIHNjb3JlX2Nvcl9wcmludF9mdW4oZDJfNzlfc2NvcmVkX2FkLCAiSEVBUlQgdnMuIE1JTkQiKWApLCBhbmQgdGhlcmUgYXBwZWFyIHRvIGJlIHNvbWV3aGF0IGZld2VyIGRhdGFwb2ludHMgYmVsb3cgdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5ID0geCQsIGRvdHRlZCBkaWFnb25hbCBsaW5lKSB0aGFuIGFib3ZlIGl0LiBIb3dldmVyLCBhcyBpbiB0aGUgQk9EWSB2cy4gSEVBUlQgYW5kIEJPRFkgdnMuIE1JTkQgY29tcGFyaXNvbnMganVzdCBkaXNjdXNzZWQsIHRoaXMgYXN5bW1ldHJ5IGlzIGxlc3Mgc3RyaWtpbmcgYW1vbmcgY2hpbGRyZW4gdGhhbiBpdCB3YXMgYW1vbmcgYWR1bHRzOiBXaGlsZSBtYW55IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBNSU5EIHRoYW4gSEVBUlQgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24gKGxpa2UgdGhlIHZhc3QgbWFqb3JpdHkgb2YgYWR1bHRzKSwgcXVpdGUgYSBmZXcgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIEhFQVJUIHRoYW4gTUlORC4gQSByZWdyZXNzaW9uIGFuYWx5c2lzIGNvbmZpcm1lZCB0aGF0LCBvbiB0aGUgd2hvbGUsIGNoaWxkcmVuJ3MgSEVBUlQgdnMuIE1JTkQgZGlmZmVyZW5jZSBzY29yZXMgd2VyZSBzdWJzdGFudGlhbGx5IG5vbi16ZXJvLCBpbiB0aGUgZGlyZWN0aW9uIG9mIGNoaWxkcmVuIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9fQk9EWV9fSEVBUlRfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNCk7IHRoaXMgZGlmZmVyZW5jZSB3YXMgcHJlc2VudCBmb3IgYm90aCB0YXJnZXQgY2hhcmFjdGVycywgYnV0IGV4YWdnZXJhdGVkIGluIGFzc2Vzc21lbnRzIG9mIHRoZSByb2JvdCAoc2VlIHRoZSAiUm9ib3QgdnMuIEdNIiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNCkuICAKCmBgYHtyfQpwbG90c19hZ2VncF9kMl9zY29yZWRfYWQgPC0gcmVsdml6X2FnZWdwX2Z1bigKICBkX3Njb3JlZCA9IGQyX2FkX3Njb3JlZF9hZCAlPiUgCiAgICBmdWxsX2pvaW4oZDJfNzlfc2NvcmVkX2FkKSwgCiAgYWdlX2dyb3VwcyA9IGMoImNoaWxkcmVuNzkiLCAiYWR1bHRzIiksCiAgYWdlX2dyb3VwX2xhYmVscyA9IGMoIkNoaWxkcmVuICg3LTl5KSIsICJBZHVsdHMiKSwKICBjb2xvcnMgPSBjb2xvcnMwMikKYGBgCgpgYGB7cn0KZmlnX2QyX2FsbF9zY29yZWRfYWRfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2FnZWdwX2QyX3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19hZ2VncF9kMl9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfYWdlZ3BfZDJfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkMxIiwgIkMyIiwgIkMzIiksIG5jb2wgPSAzKQoKZmlnX2QyX2FsbF9zY29yZWRfYWRfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfYWdlZ3BfZDJfc2NvcmVkX2FkW1sxXV0gKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgIG5hLnRyYW5zbGF0ZSA9IEYsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkpCgpmaWdfZDJfYWxsX3Njb3JlZF9hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKAogIGZpZ19kMl9hbGxfc2NvcmVkX2FkX3Bsb3RzLCBmaWdfZDJfYWxsX3Njb3JlZF9hZF9sZWcsCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kMl9hbGxfc2NvcmVkX2FkX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiVHJhY2tpbmcgZGV2ZWxvcG1lbnQgYmV0d2VlbiA3LTl5IGFuZCBhZHVsdGhvb2QgKHNjb3JlZCB1c2luZyBhZHVsdHMnIHNjYWxlcykiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2QyX2FsbF9zY29yZWRfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZCgKICBmaWdfZDJfYWxsX3Njb3JlZF9hZF90aXRsZSwgZmlnX2QyX2FsbF9zY29yZWRfYWRfcGxvdHNfbGVnLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3J9CmZpZ3VyZTQuMyA8LSBwbG90X2dyaWQoZmlnX2QyX2FkX3Bsb3RzX2xlZ190aXRsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgZmlnX2QyXzc5X3Bsb3RzX2xlZ190aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICBmaWdfZDJfYWxsX3Njb3JlZF9hZF9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEpCgpmaWd1cmU0LjNfY2FwIDwtIGFkZF9zdWIoZmlndXJlNC4zLCBzdHJfd3JhcCgiRmlndXJlIDQuMzogUmVsYXRpb25zaGlwcyBhbW9uZyBVUyBhZHVsdHMnIGFuZCBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBjb25jZXB0dWFsIHVuaXRzIGluIFN0dWR5IDIsIHNjb3JlZCB1c2luZyBhZHVsdHMnIEJPRFksIEhFQVJULCBhbmQgTUlORCBzY2FsZXMgKHNlZSBUYWJsZSA0LjEwKS4gUGxvdHMgYXJlIG9yZ2FuaXplZCBieSBzYW1wbGUgKHJvd3MpIGFuZCBieSBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKGNvbHVtbnMpLiAoQSkgQWR1bHRzLiAoQikgQ2hpbGRyZW4gKDctOXkgb2YgYWdlKSwgc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzLiAoQykgQSB2aXN1YWxpemF0aW9uIG9mIGRldmVsb3BtZW50IGJldHdlZW4gNy05eSBhbmQgYWR1bHRob29kLCB1c2luZyBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYW5kIGFnZSBncm91cC4gRm9yIGVhY2ggY29uY2VwdHVhbCB1bml0LCBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAwLTEuIEluIHBhbmVscyBBLUIsIGluZGl2aWR1YWwgcGFydGljaXBhbnRzIGFyZSBwbG90dGVkIGFzIHNtYWxsLCB0cmFuc2x1Y2VudCBjaXJjbGVzLCBhbmQgbWVhbiBzY29yZXMgYnkgY2hhcmFjdGVyIGFyZSBwbG90dGVkIGFzIGxhcmdlciwgc29saWQgZGlhbW9uZHMuIEVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFRoZSBkb3R0ZWQgbGluZSBjb3JyZXNwb25kcyB0byBlcXVhbCBlbmRvcnNlbWVudHMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIHBsb3R0ZWQuIFBlYXJzb24gY29ycmVsYXRpb25zIGFyZSByZXBvcnRlZCBmb3IgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMuIiwgMTEwKSwgeCA9IDAsIGhqdXN0ID0gMCkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxLjR9CmdnZHJhdyhmaWd1cmU0LjNfY2FwKQpgYGAKCiMjIyBEZXZlbG9wbWVudGFsIGNvbXBhcmlzb24KClRoZSBwcmVjZWRpbmcgdmlzdWFsaXphdGlvbnMgYW5kIGFuYWx5c2VzIGFsbCBzdWdnZXN0ZWQgdGhhdCBjaGlsZHJlbidzIHJlc3BvbnNlcyB3ZXJlIGdlbmVyYWxseSBsZXNzIGFzeW1tZXRyaWNhbCB0aGFuIHRob3NlIG9mIGFkdWx0cy4gVGhpcyBpcyBwZXJoYXBzIGVhc2llc3QgdG8gb2JzZXJ2ZSBpbiBGaWd1cmUgNC4zLCByb3cgRCwgd2hpY2ggcHJlc2VudHMgKGh5cG90aGV0aWNhbCkgIm1vdmVtZW50IiBiZXR3ZWVuIHRoZSBtZWFuIHBsYWNlbWVudCBmb3IgYSB0YXJnZXQgY2hhcmFjdGVyIGFtb25nIGNoaWxkcmVuIChiZWdpbm5pbmcgb2YgYXJyb3cpIGFuZCB0aGUgbWVhbiBwbGFjZW1lbnQgZm9yIGEgdGFyZ2V0IGNoYXJhY3RlciBhbW9uZyBhZHVsdHMgKGFycm93aGVhZCksIGZvciBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cy4gSW4gZWFjaCBjYXNlLCB0aGlzICJtb3ZlbWVudCIgZWl0aGVyIG1haW50YWlucyBhIHNpbWlsYXIgZGlzdGFuY2UgZnJvbSB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCkgKGFzIHdpdGggbWVhbiBhc3Nlc3NtZW50cyBvZiB0aGUgcm9ib3QgaW4gdGhlIEJPRFkgdnMuIEhFQVJUIHNwYWNlLCBwYW5lbCBDMTsgYW5kIHRoZSBiZWV0bGUgaW4gdGhlIEJPRFkgdnMuIE1JTkQgc3BhY2UsIHBhbmVsIEMyKSBvciBtb3ZlcyBhd2F5IGZyb20gdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgdG93YXJkIHRoZSB1cHBlciBsZWZ0IGFuZCBsb3dlciByaWdodCBjb3JuZXJzIG9mIHRoZSBwbG90IChhcyB3aXRoIG1lYW4gYXNzZXNzbWVudHMgb2YgdGhlIGJlZXRsZSBpbiB0aGUgQk9EWSB2cy4gSEVBUlQgc3BhY2UsIHBhbmVsIEMxOyB0aGUgcm9ib3QgaW4gdGhlIEJPRFkgdnMuIE1JTkQgc3BhY2UsIHBhbmVsIEMyOyBhbmQgYm90aCBjaGFyYWN0ZXJzIGluIHRoZSBIRUFSVCB2cy4gTUlORCBzcGFjZSwgcGFuZWwgQzMpLiBBbmFseXNpcyBvZiBjaGFuZ2VzIGluIF9hYnNvbHV0ZV8gYXR0cmlidXRpb25zIG9mIEJPRFksIEhFQVJULCBhbmQgTUlORCwgaXMgcHVyc3VlZCBpbiBDaGFwdGVyIFY7IGZvciB0aGUgcHVycG9zZXMgb2YgdGhlIGN1cnJlbnQgY2hhcHRlciwgdGhlIHByaW1hcnkgb2JzZXJ2YXRpb24gb2YgaW50ZXJlc3QgaXMgdGhhdCB0aGVzZSAic2hpZnRzIiBiZXR3ZWVuIGNoaWxkIGFuZCBhZHVsdCBhc3Nlc3NtZW50cyBvZiB0aGVzZSBjaGFyYWN0ZXJzIGdlbmVyYWxseSBwb2ludCBpbiB0aGUgZGlyZWN0aW9uIG9mIHN0YWJsZSBvciBpbmNyZWFzaW5nIChub3QgZGVjcmVhc2luZykgYXN5bW1ldHJpZXMgb3ZlciBkZXZlbG9wbWVudGFsIHRpbWUuCgpUbyBhc3Nlc3MgdGhlIHNpemUgYW5kIHJvYnVzdG5lc3Mgb2YgdGhlc2UgYXBwYXJlbnQgZGV2ZWxvcG1lbnRhbCBkaWZmZXJlbmNlcywgSSBjb25kdWN0ZWQgZm9ybWFsIGNvbXBhcmlzb25zIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gY29uY2VwdHVhbCB1bml0cyBhbW9uZyB0aGVzZSB0d28gYWdlIGdyb3Vwcy4gRm9yIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzLCBJIHBvb2xlZCBkYXRhIGZyb20gYm90aCBhZ2UgZ3JvdXBzIGFuZCBtb2RpZmllZCBteSByZWdyZXNzaW9uIGFuYWx5c2VzIHRvIGluY2x1ZGUgYSBtYWluIGVmZmVjdCBvZiBhZ2UgZ3JvdXAgKGNvbXBhcmluZyBjaGlsZHJlbidzIGRpZmZlcmVuY2Ugc2NvcmVzIHRvIHRoZSBiYXNlbGluZSBzZXQgYnkgYWR1bHRzKSBhbmQgYW4gaW50ZXJhY3Rpb24gYmV0d2VlbiBhZ2UgZ3JvdXAgYW5kIHRhcmdldCBjaGFyYWN0ZXIgKGFzc2Vzc2luZyB3aGV0aGVyIHRoZSBvYnNlcnZlZCBkaWZmZXJlbmNlcyBiZXR3ZWVuIGNoYXJhY3RlcnMgdmFyaWVkIGJ5IGFnZSBncm91cCkuCgpgYGB7cn0KZDJfYWQ3OV9zY29yZWRfYWRfZGlmZiA8LSBmdWxsX2pvaW4oZDJfYWRfc2NvcmVkX2FkX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyXzc5X3Njb3JlZF9hZF9kaWZmKSAlPiUKICBtdXRhdGUoYWdlX2dyb3VwID0gZmFjdG9yKGFnZV9ncm91cCkpCmNvbnRyYXN0cyhkMl9hZDc5X3Njb3JlZF9hZF9kaWZmJGNoYXJhY3RlcikgPC0gY29udHJhc3RzX3N1bV9lZGdlCmNvbnRyYXN0cyhkMl9hZDc5X3Njb3JlZF9hZF9kaWZmJGFnZV9ncm91cCkgPC0gY29udHJhc3RzX2R1bTJfYWdlZ3AKYGBgCgpgYGB7cn0KIyByX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciAqIGFnZV9ncm91cCwKIyAgIGRhdGEgPSBkMl9hZDc5X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksIAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKcl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyICogYWdlX2dyb3VwLAojICAgZGF0YSA9IGQyX2FkNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLCAKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpyX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKc3VtbWFyeShyX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyICogYWdlX2dyb3VwLAojICAgZGF0YSA9IGQyX2FkNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwgCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpyX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCmBgYHtyfQpyZWd0YWJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX3JlZ190YWJsZV9mdW4oCiAgcmVnX2xpc3QgPSBsaXN0KHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAogICAgICAgICAgICAgICAgICByX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCksCiAgcGFpcl9saXN0ID0gYygiQk9EWSAtIEhFQVJUIiwgIkJPRFkgLSBNSU5EIiwgIkhFQVJUIC0gTUlORCIpLAogIHN0dWR5X25hbWUgPSAiRGV2ZWxvcG1lbnRhbCBjb21wYXJpc29uIiwKICBjaGFyX2xhYmVsID0gIlJvYm90IHZzLiBHTSIsIAogIGFnZWdwX2xhYmVsID0gIkNoaWxkcmVuIHZzLiBhZHVsdHMiKQpgYGAKCmBgYHtyfQojIGludGVyaW0gdGFibGUgZm9yIGVhc2Ugb2Ygd3JpdGluZwpyZWd0YWJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgZmlsdGVyKHBhcmFtICVpbiUgYygiQ2hpbGRyZW4gdnMuIGFkdWx0cyIsICJJbnRlcmFjdGlvbiIpKSAlPiUKICBrYWJsZShkaWdpdHMgPSAyKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpwbG90X2dyaWQocGxvdF9kMl9hZF9zY29yZWRfYWRfZGlmZiwgcGxvdF9kMl83OV9zY29yZWRfYWRfZGlmZiwgbmNvbCA9IDIpCmBgYAoKVGhlc2UgYW5hbHlzZXMgY29uZmlybWVkIHRoYXQgZGlmZmVyZW5jZSBzY29yZXMgZm9yIGFsbCB0aHJlZSBwYWlycyBvZiBjb25jZXB0dWFsIHVuaXRzIHdlcmUgc3Vic3RhbnRpYWxseSBjbG9zZXIgdG8gemVybyBhbW9uZyBjaGlsZHJlbiwgYXMgY29tcGFyZWQgdG8gYWR1bHRzIChzZWUgdGhlICJDaGlsZHJlbiB2cy4gYWR1bHRzIiByb3dzIGZvciBlYWNoIGNvbXBhcmlzb24gaW4gVGFibGUgNC41KS4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyB3YXMgYXR0ZW51YXRlZCBhbW9uZyBjaGlsZHJlbiBpbiB0aGUgQk9EWSB2cy4gTUlORCBjb21wYXJpc29uLCBidXQgbm90IGluIG90aGVyIGNvbXBhcmlzb25zIChzZWUgdGhlICJSb2JvdCB2cy4gR00iIHJvd3MgaW4gVGFibGUgNC41KS4KCiMjIyBJbnRlcmltIGRpc2N1c3Npb24KCkJvdGggdmlzdWFsIGluc3BlY3Rpb24gYW5kIGZvcm1hbCBhbmFseXNlcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyBCT0RZLCBIRUFSVCwgYW5kIE1JTkQgc3VnZ2VzdCB0aGF0IHRoZSB0aGUgYXN5bW1ldHJpZXMgaW4gcmVsYXRpb25zaGlwcyBhbW9uZyA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuJ3MgZW5kb3JzZW1lbnRzIG9mIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMgd2VyZSBzaW1pbGFyIGluIGRpcmVjdGlvbuKAlGJ1dCBzdWJzdGFudGlhbGx5IGF0dGVudWF0ZWQgaW4gc2l6ZeKAlHJlbGF0aXZlIHRvIHRoZSBiYXNlbGluZSBzZXQgYnkgYWR1bHRzLiBUaGlzIHN1Z2dlc3RzIHRoYXQgdGhlIHByb3Bvc2VkIGhpZXJhcmNoaWNhbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlc2UgY29uY2VwdHVhbCB1bml0cyBhcmUgbmFzY2VudCBpbiB0aGlzIGFnZSBncm91cCwgYnV0IG1heSBub3QgYmUgZnVsbHkgcm9idXN0IG9yICJtYXR1cmUuIgoKIyMjIENoaWxkcmVuICg3LTl5KSwgdXNpbmcgY2hpbGRyZW4ncyBvd24gc2NhbGVzCgpUaGUgcHJldmlvdXMgYW5hbHlzZXMgbWFkZSB1c2Ugb2YgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjb3JlcyBkZXJ2aWVkIGZyb20gRUZBcyBvZiBhZHVsdHMnIG1lbnRhbCBjYXBhY2l0eSByZXByZXNlbnRhdGlvbnMgdG8gZXhhbWluZSB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGVzZSBjb25jZXB0dWFsIHVuaXRzIGFtb25nIGJvdGggYWR1bHRzIGFuZCBjaGlsZHJlbi4gQnV0IENoYXB0ZXIgSUlJIHN1Z2dlc3RlZCB0aGF0LCB3aGlsZSA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuJ3MgY29uY2VwdHVhbCB1bml0cyB3ZXJlIHZlcnkgc2ltaWxhciB0byB0aG9zZSBvZiBhZHVsdHMsIHRoZXkgd2VyZSBub3QgZXhhY3RseSBpZGVudGljYWwuIFdoYXQgd291bGQgd291bGQgdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIGxvb2sgbGlrZSBpZiB0aGV5IHdlcmUgYXNzZXNzZWQgdXNpbmcgc2NhbGVzIGRlcml2ZWQgZnJvbSBjaGlkbHJlbidzIG93biByZXNwb25zZXMsIHJhdGhlciB0aGFuIGFkdWx0cyc/IEhlcmUgSSBicmllZmx5IGNvbnNpZGVyIHRoaXMgcG9zc2liaWxpdHkgZm9yIGNoaWxkcmVuIGluIFN0dWR5IDI7IGZvciBwYXJhbGxlbCBhbmFseXNlcyBmb3IgY2hpbGRyZW4gaW4gU3R1ZGllcyAzIGFuZCA0LCBzZWUgW1hYIEFQUEVORElYIEI/XS4gCgojIyMjIFNjYWxlIGNvbnN0cnVjdGlvbgoKYGBge3J9CnNjYWxlc19lZmFfd2RtX2QyXzc5IDwtIHNjYWxlX2Z1bihlZmFfd2RtX2QyXzc5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QyXzc5KQpkMl83OV9zY29yZWRfNzkgPC0gc2NvcmVfZnVuKGQyXzc5LCBzY2FsZXNfZWZhX3dkbV9kMl83OSkKCnNhdmVSRFMoc2NhbGVzX2VmYV93ZG1fZDJfNzksIGZpbGUgPSAiLi9zdG9yZWQvc2NhbGVzL3NjYWxlc19lZmFfd2RtX2QyXzc5IikKc2F2ZVJEUyhkMl83OV9zY29yZWRfNzksIGZpbGUgPSAiLi9zdG9yZWQvc2NvcmVkX2RhdGEvZDJfNzlfc2NvcmVkXzc5IikKYGBgCgpgYGB7cn0Kc2NhbGVzX3N0dWR5MiA8LSBiaW5kX3Jvd3Moc2NhbGVzX2VmYV93ZG1fZDJfYWQgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJBZHVsdHMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzX2VmYV93ZG1fZDJfNzkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJDaGlsZHJlbiwgNy05eSIpKSAlPiUKICBzZWxlY3QoLWMobG9hZGluZywgb3JkZXIpKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIHNwcmVhZChzdHVkeSwgZmFjdG9yKSAlPiUKICBtdXRhdGUodXJfZmFjdG9yID0gaWZlbHNlKCFpcy5uYShgQWR1bHRzYCksIGBBZHVsdHNgLCBgQ2hpbGRyZW4sIDctOXlgKSkgJT4lCiAgbGVmdF9qb2luKHNjYWxlc19lZmFfd2RtX2QyX2FkICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKSAlPiUgcmVuYW1lKG9yZGVyX2FkID0gb3JkZXIpKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDJfNzkgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXJfNzkgPSBvcmRlcikpICU+JQogIGFycmFuZ2UodXJfZmFjdG9yLCBvcmRlcl9hZCwgb3JkZXJfNzkpICU+JQogIHNlbGVjdCgtdXJfZmFjdG9yKSAjICU+JQojIHNlbGVjdCgtc3RhcnRzX3dpdGgoIm9yZGVyIikpCmBgYAoKYGBge3J9CiMgYmlnIHRhYmxlIGZvciBzY2FsZXMgbG9jYXRlZCBhdCBzdHVkeSA0CmBgYAoKRm9sbG93aW5nIHRoZSBzdGVwcyBkZXNjcmliZWQgaW4gdGhlICJHZW5lcmFsIGFuYWx5c2lzIHBsYW4sIiBhYm92ZSwgeWllbGRlZCBgciBmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QyXzc5KWAgc2NhbGVzIG9mIGByIHNjYWxlc19lZmFfd2RtX2QyXzc5ICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKWAgaXRlbXMgZWFjaC4gTm90YWJseSwgY2hpbGRyZW4ncyBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzIHdlcmUgdmVyeSBzaW1pbGFyIHRvIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzIGRlcml2ZWQgZnJvbSBhZHVsdHMgaW4gdGhpcyBzdHVkeSwgZGlmZmVyaW5nIGJ5IG9ubHkgb25lIGl0ZW0gZWFjaC4gVGhlIF9NSU5EXyBzY2FsZXMgZm9yIGNoaWxkcmVuIHZzLiBhZHVsdHMgaGFkIHRocmVlIGl0ZW1zIGluIGNvbW1vbiwgYW5kIGRpZmZlcmVkIGJ5IHRocmVlIGl0ZW1zOyBzZWUgVGFibGUgNC4xMC4KCiMjIyMgVmlzdWFsaXphdGlvbiBhbmQgYW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKCmBgYHtyfQpwbG90c19kMl83OV9zY29yZWRfNzkgPC0gcmVsdml6X2Z1bihkMl83OV9zY29yZWRfNzkpCmBgYAoKYGBge3J9CmZpZ19kMl83OV9zY29yZWRfNzlfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QyXzc5X3Njb3JlZF83OVtbMV1dICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMl83OV9zY29yZWRfNzlbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QyXzc5X3Njb3JlZF83OVtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQTEiLCAiQTIiLCAiQTMiKSwgbmNvbCA9IDMpCgpmaWdfZDJfNzlfc2NvcmVkXzc5X2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QyXzc5X3Njb3JlZF83OVtbMV1dICsgCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKCmZpZ19kMl83OV9zY29yZWRfNzlfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWdfZDJfNzlfc2NvcmVkXzc5X3Bsb3RzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19kMl83OV9zY29yZWRfNzlfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kMl83OV9zY29yZWRfNzlfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAyOiBDaGlsZHJlbiwgNy05eSAoc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMpIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kMl83OV9zY29yZWRfNzlfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDJfNzlfc2NvcmVkXzc5X3RpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19kMl83OV9zY29yZWRfNzlfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpmaWdfZDJfNzlfc2NvcmVkXzc5X3Bsb3RzX2xlZ190aXRsZQpgYGAKCmBgYHtyfQpmaWd1cmU0LjQgPC0gcGxvdF9ncmlkKGZpZ19kMl83OV9zY29yZWRfNzlfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSkKCmZpZ3VyZTQuNF9jYXAgPC0gYWRkX3N1YihmaWd1cmU0LjQsIHN0cl93cmFwKCJGaWd1cmUgNC40OiBSZWxhdGlvbnNoaXBzIGFtb25nIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgMiwgc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMgKHNlZSBUYWJsZSA0LjEwKS4gUGxvdHMgYXJlIG9yZ2FuaXplZCBieSBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKGNvbHVtbnMpLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMS4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZC4gUGVhcnNvbiBjb3JyZWxhdGlvbnMgYXJlIHJlcG9ydGVkIGZvciBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cy4iLCAxMTApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNTV9CmdnZHJhdyhmaWd1cmU0LjRfY2FwKQpgYGAKCmBgYHtyfQpkMl83OV9zY29yZWRfNzlfZGlmZiA8LSBkaWZmX2Z1bihkMl83OV9zY29yZWRfNzkpCmNvbnRyYXN0cyhkMl83OV9zY29yZWRfNzlfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZWRnZQoKc2F2ZVJEUyhkMl83OV9zY29yZWRfNzlfZGlmZiwgIi4vc3RvcmVkL2RpZmZzY29yZV9kYXRhL2QyXzc5X3Njb3JlZF83OV9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kMl83OV9zY29yZWRfNzlfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDJfNzlfc2NvcmVkXzc5X2RpZmYpCmBgYAoKYGBge3J9CiMgcl9kMl83OV9zY29yZWRfNzlfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQyXzc5X3Njb3JlZF83OV9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl83OV9zY29yZWRfNzlfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfQk9EWV9IRUFSVCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kMl83OV9zY29yZWRfNzlfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkXzc5X2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMl83OV9zY29yZWRfNzlfZGlmZl9CT0RZX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl83OV9zY29yZWRfNzlfZGlmZl9CT0RZX01JTkQiKQoKcl9kMl83OV9zY29yZWRfNzlfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl83OV9zY29yZWRfNzlfZGlmZl9CT0RZX01JTkQiKQoKc3VtbWFyeShyX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QyXzc5X3Njb3JlZF83OV9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkXzc5X2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyXzc5X3Njb3JlZF83OV9kaWZmX0hFQVJUX01JTkQiKQoKcl9kMl83OV9zY29yZWRfNzlfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDJfNzlfc2NvcmVkXzc5X2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfSEVBUlRfTUlORCkKYGBgCgpgYGB7cn0KcmVndGFiX2QyXzc5X3Njb3JlZF83OV9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kMl83OV9zY29yZWRfNzlfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfTUlORCwKICAgICAgICAgICAgICAgICAgcl9kMl83OV9zY29yZWRfNzlfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJDaGlsZHJlbiwgNy05eSAodXNpbmcgdGhlaXIgb3duIHNjYWxlcykiLAogIGNoYXJfbGFiZWwgPSAiUm9ib3QgdnMuIEdNIikKYGBgCgpgYGB7cn0KIyBpbnRlcmltIHRhYmxlIGZvciBlYXNlIG9mIHdyaXRpbmcKcmVndGFiX2QyXzc5X3Njb3JlZF83OV9kaWZmICU+JQogIHNlbGVjdCgtc3R1ZHksIC1zLmUuKSAlPiUKICBmaWx0ZXIocGFyYW0gPT0gIkludGVyY2VwdCIpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCnBsb3RfZDJfNzlfc2NvcmVkXzc5X2RpZmYKYGBgCgpWaXN1YWxpemF0aW9ucyBvZiByZWxhdGlvbnNoaXBzIGFtb25nIHNjb3JlcyBvbiB0aGVzZSBjaGlsZC1iYXNlZCBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzIGFyZSBwcm92aWRlZCBpbiBGaWd1cmUgNC40LCBhbmQgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBwYWlycyBvZiBjb25jZXB0dWFsIHVuaXRzIGFyZSBkZXBpY3RlZCBpbiBGaWd1cmUgNC41LCBwYW5lbCBDLiBBcyB0aGVzZSBwbG90cyBpbGx1c3RyYXRlLCB0aGUgcGF0dGVybiBvZiByZXN1bHRzIHVzaW5nIHRoZXNlIGNoaWxkLWJhc2VkIHNjYWxlcyB3YXMgdmlydHVhbGx5IGlkZW50aWNhbCB0byB0aGUgcGF0dGVybiBvZiByZXN1bHRzIHVzaW5nIHRoZSBhZHVsdC1iYXNlZCBzY2FsZXMgYXMgZGlzY3Vzc2VkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uOyBzZWUgVGFibGUgNC41IGZvciBhIGp1eHRhcG9zaXRpb24gb2YgdGhlIHJlZ3Jlc3Npb24gYW5hbHlzZXMuIFRoaXMgc3VnZ2VzdHMgdGhhdCB0aGlzIGF0dGVudWF0aW9uIG9mIGFzeW1tZXRyaWVzIGFjcm9zcyBwYWlycyBvZiBjb25jZXB0dWFsIHVuaXRzIHdhcyBub3QgbWVyZWx5IGR1ZSB0byB0aGUgb3BlcmF0aW9uYWxpemF0aW9uIG9mIEJPRFksIEhFQVJULCBhbmQgTUlORCB1c2luZyBhZHVsdHMnIHJhdGhlciB0aGFuIGNoaWxkcmVuJ3MgRUZBIHNvbHV0aW9uczsgdGhlc2UgZGV2ZWxvcG1lbnRhbCBkaWZmZXJlbmNlcyB3ZXJlIG9ic2VydmVkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGVzZSBjb25jZXB0dWFsIHVuaXRzIHdlcmUgaW5kZXhlZCBieSBzY2FsZXMgZGVzaWduZWQgdG8gY2FwdHVyZSBhZHVsdHMnIG9yIGNoaWxkcmVuJ3MgY29uc3RydWFscyBvZiBCT0RZLCBIRUFSVCwgYW5kIE1JTkQuIAoKYGBge3J9CmZpZ3VyZTQuNV9wbG90cyA8LSBwbG90X2dyaWQoCiAgcGxvdF9kMl9hZF9zY29yZWRfYWRfZGlmZiArCiAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDI6IEFkdWx0cyIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwKICBwbG90X2QyXzc5X3Njb3JlZF9hZF9kaWZmICsKICAgIGxhYnModGl0bGUgPSAiU3R1ZHkgMjogQ2hpbGRyZW4sIDctOXkgKHNjb3JlZCB1c2luZyBhZHVsdHMnIHNjYWxlcykiKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiksCiAgcGxvdF9kMl83OV9zY29yZWRfNzlfZGlmZiArIAogICAgbGFicyh0aXRsZSA9ICJTdHVkeSAyOiBDaGlsZHJlbiwgNC02eSAoc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMpIikgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpLCAKICBuY29sID0gMywgcmVsX3dpZHRocyA9IGMoMSwgMSwgMSksCiAgbGFiZWxzID0gIkFVVE8iKQoKZmlndXJlNC41X2NhcCA8LSBhZGRfc3ViKGZpZ3VyZTQuNV9wbG90cywgc3RyX3dyYXAoIkZpZ3VyZSA0LjU6IERpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gVVMgYWR1bHRzJyBhbmQgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkeSAyLiB0aGlzIGluY2x1ZGVzIGRpZmZlcmVuY2Ugc2NvcmVzIHVzaW5nIGFkdWx0cycgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIHNjYWxlcyAocGFuZWwgQikgYW5kIGRpZmZlcmVuY2Ugc2NvcmVzIHVzaW5nIGNoaWxkcmVuJ3Mgb3duIHNjYWxlcyAocGFuZWwgQzsgc2VlIFRhYmxlIDQuMTApLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMSwgc3VjaCB0aGF0IGRpZmZlcmVuY2Ugc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gLTEgdG8gKzEuIEluZGl2aWR1YWwgcGFydGljaXBhbnRzIGFyZSBwbG90dGVkIGFzIHNtYWxsLCB0cmFuc2x1Y2VudCBjaXJjbGVzLCBhbmQgbWVhbiBkaWZmZXJlbmNlIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZCAoaS5lLiwgYSBkaWZmZXJlbmNlIHNjb3JlIG9mIDApLiIsIDE4MCksIHggPSAwLCBoanVzdCA9IDApCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMC4zOH0KZ2dkcmF3KGZpZ3VyZTQuNV9jYXApCmBgYAoKIyMgRGlzY3Vzc2lvbgoKU3R1ZHkgMiBwcm92aWRlcyBmdXJ0aGVyIGNvbmZpcm1hdGlvbiBvZiB0aGUgcm9idXN0bmVzcyBvZiB0aGUgYXN5bW1ldHJpYyByZWxhdGlvbnNoaXBzIGFtb25nIGNvbmNlcHR1YWwgdW5pdHMgaW4gYWR1bHRzJyByZXByZXNlbnRhdGlvbnMgb2YgbWVudGFsIGxpZmUgYXMgcmV2ZWFsZWQgYnkgU3R1ZHkgMS4gVXNpbmcgYSBtb2RpZmllZCBleHBlcmltZW50YWwgcGFyYWRpZ20sIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHNldCBvZiBtZW50YWwgY2FwYWNpdGllcywgYW5kIGEgdGhyZWUtcG9pbnQgKHJhdGhlciB0aGFuIHNldmVuLXBvaW50KSByZXNwb25zZSBzY2FsZSByZXZlYWxlZCB0aGUgc2FtZSBwYXR0ZXJuIG9mIGFzeW1tZXRyaWVzIGluIGFkdWx0cycgZW5kb3JzZW1lbnRzIG9mIEJPRFksIEhFQVJULCBhbmQgTUlORDogUmVnYXJkbGVzcyBvZiB3aGljaCBvZiB0aGUgdHdvICJlZGdlIGNhc2VzIiB0aGV5IGFzc2Vzc2VkLCBhZHVsdHMgc3lzdGVtYXRpY2FsbHkgZW5kb3JzZWQgYm90aCBCT0RZIGFuZCBNSU5EIGF0IGxlYXN0IGFzIHN0cm9uZ2x5LCBhbmQgb2Z0ZW4gbW9yZSBzdHJvbmdseSwgdGhhbiBIRUFSVCwgd2hpbGUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIE1JTkQgd2FzIG1vcmUgY29udGluZ2VudCBvbiB0aGUgdGFyZ2V0IGNoYXJhY3RlciB1bmRlciBldmFsdWF0aW9uLgoKU3R1ZHkgMiBhbHNvIGFmZm9yZHMgdGhlIGZpcnN0IGdsaW1wc2UgaW50byB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBhc3BlY3Qgb2YgY29uY2VwdHVhbCByZXByZXNlbnRhdGlvbnMgb2YgbWVudGFsIGxpZmUgYW1vbmcgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbi4gQSB2YXJpZXR5IG9mIHZpc3VhbGl6YXRpb25zIGFuZCBhbmFseXNlcyBjb252ZXJnZSB0byBzdWdnZXN0IHRoYXQsIG9uIHRoZSB3aG9sZSwgdGhlIF9kaXJlY3Rpb25zXyBvZiB0aGVzZSByZWxhdGlvbnNoaXBzIGFtb25nIGNvbmNlcHR1YWwgdW5pdHMgYXJlIGluIHBsYWNlIGJ5IHRoaXMgcG9pbnQgaW4gZGV2ZWxvcG1lbnQsIGJ1dCB0aGVzZSBhc3ltbWV0cmllcyBhcmUgbm90IG5lYXJseSBhcyBwcm9ub3VuY2VkIG9yIHJvYnVzdCBhbW9uZyBjaGlsZHJlbiBhcyB0aGV5IGFwcGVhciB0byBiZSBhbW9uZyBhZHVsdHMuIAoKVGhlcmUgYXJlIHNvbWUgaGludHMgZnJvbSBTdHVkeSAyIHRoYXQgdGhlIGFzeW1tZXRyeSBiZXR3ZWVuIEJPRFkgdnMuIEhFQVJUIG1heSBiZSBhIHBvaW50IG9mIHBhcnRpY3VsYXIgaW1tYXR1cml0eSBmb3IgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbjogV2hpbGUgdmVyeSBmZXcgYWR1bHRzIGluIHRoaXMgc3R1ZHkgKG9yIGluIGFueSBwcmV2aW91cyBzdHVkeSkgZW5kb3JzZWQgX0hFQVJUXyBjYXBhY2l0aWVzIG1vcmUgc3Ryb25nbHkgdGhhbiBfQk9EWV8gY2FwYWNpdGllcyBmb3IgYW55IHRhcmdldCBjaGFyYWN0ZXIsIHF1aXRlIGEgbG90IG9mIGNoaWxkcmVuIGRpZOKAlHBhcnRpY3VsYXJseSBpZiB0aGV5IGhhcHBlbmVkIHRvIGFzc2VzcyB0aGUgcm9ib3QuIEluZGVlZCwgb24gdGhlIHdob2xlLCBjaGlsZHJlbiBpbiB0aGlzIHN0dWR5IHNob3dlZCBubyBzeXN0ZW1hdGljIGFzeW1tZXRyeSBiZXR3ZWVuIHRoZXNlIHR3byBjb25jZXB0dWFsIHVuaXRzLgoKYGBge3J9CnJlZ3RhYl9zdHVkeTIgPC0gcmVndGFiX2QyX2FkX3Njb3JlZF9hZF9kaWZmICU+JQogIGZ1bGxfam9pbihyZWd0YWJfZDJfNzlfc2NvcmVkX2FkX2RpZmYpICU+JQogIGZ1bGxfam9pbihyZWd0YWJfZDJfNzlfc2NvcmVkXzc5X2RpZmYpICU+JQogIG11dGF0ZV9hdCh2YXJzKGIsIHMuZS4pLAogICAgICAgICAgICBmdW5zKGZvcm1hdChyb3VuZCguLCBkaWdpdHMgPSAyKSwgbnNtYWxsID0gMikpKSAlPiUKICB1bml0ZShyZXN1bHQsIGIsIHMuZS4sIENJOTUsIG5vbnplcm8pICU+JQogIHNwcmVhZChzdHVkeSwgcmVzdWx0KSAlPiUKICBzZXBhcmF0ZShgQWR1bHRzYCwgYygiczJhX2IiLCAiczJhX3MuZS4iLCAiczJhXzk1JSBDSSIsICJzMmFfbnoiKSwgc2VwID0gIl8iKSAlPiUKICBzZXBhcmF0ZShgQ2hpbGRyZW4sIDctOXkgKHVzaW5nIGFkdWx0cycgc2NhbGVzKWAsIGMoInMyYl9iIiwgInMyYl9zLmUuIiwgInMyYl85NSUgQ0kiLCAiczJiX256IiksIHNlcCA9ICJfIikgJT4lCiAgc2VwYXJhdGUoYENoaWxkcmVuLCA3LTl5ICh1c2luZyB0aGVpciBvd24gc2NhbGVzKWAsIGMoInMyY19iIiwgInMyY19zLmUuIiwgInMyY185NSUgQ0kiLCAiczJjX256IiksIHNlcCA9ICJfIikKYGBgCgpgYGB7cn0KdGFibGU0LjQgPC0gcmVndGFiX3N0dWR5MiAlPiUKICBzZWxlY3QoLXBhaXIsIC1jb250YWlucygicy5lLiIpKSAlPiUKICByZW5hbWUoUGFyYW1ldGVyID0gcGFyYW0pICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJueiIsICIgIiwgLikpKSAlPiUKICByZW5hbWVfYWxsKGZ1bnMoZ3N1YigiczIuXyIsICIiLCAuKSkpICU+JQogIGthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKGMocmVwKCJyIiwgMiksICJsIiksIDMpKSwgCiAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSA0LjQ6IFJlZ3Jlc3Npb24gYW5hbHlzZXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgYW1vbmcgVVMgYWR1bHRzIGFuZCBjaGlsZHJlbiAoNy05eSBvZiBhZ2UpIGluIFN0dWR5IDIuIEZvciBjaGlsZHJlbiwgdGhpcyBpbmNsdWRlcyBhbiBhbmFseXNpcyB1c2luZyBhZHVsdHMnIEJPRFksIEhFQVJULCBhbmQgTUlORCBzY2FsZXMgKG1pZGRsZSBjb2x1bW5zKSwgYXMgd2VsbCBhcyBhbiBhbmFseXNpcyB1c2luZyBzY2FsZXMgZGVyaXZlZCBmcm9tIEVGQSBvZiBjaGlsZHJlbidzIG93biBtZW50YWwgY2FwYWNpdHkgYXR0cmlidXRpb25zIChyaWdodG1vc3QgY29sdW1ucykuIFRoZSB0YWJsZSBwcmVzZW50cyByZXN1bHRzIGZyb20gc2VwYXJhdGUgQmF5ZXNpYW4gcmVncmVzc2lvbnMgb2YgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKEJPRFkgdnMuIEhFQVJULCBCT0RZIHZzLiBNSU5ELCBhbmQgSEVBUlQgdnMuIE1JTkQpLiBFYWNoIHJlZ3Jlc3Npb24gaW5jbHVkZWQgdHdvIGZpeGVkIGVmZmVjdCBwYXJhbWV0ZXJzOiAoMSkgdGhlIGludGVyY2VwdCwgd2hpY2ggSSB0cmVhdCBhcyBhbiBpbmRleCBvZiB0aGUgYXN5bW1ldHJ5IGluIGF0dHJpYnV0aW9ucyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgaW4gcXVlc3Rpb247IGFuZCAoMikgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMsIHJlcG9ydGVkIGhlcmUgYXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJvYm90IGFuZCB0aGUgZ3JhbmQgbWVhbiAoR00pLiBUaGUgaW50ZXJjZXB0cyBhcmUgaGlnaGxpZ2h0ZWQgaW4gYm9sZCwgYmVjYXVzZSB0aGVzZSBhcmUgdGhlIHByaW1hcnkgcGFyYW1ldGVycyBvZiBpbnRlcmVzdCBmb3IgdGhlc2UgYW5hbHlzZXMuIEZvciBlYWNoIHBhcmFtZXRlciwgdGhlIHRhYmxlIGluY2x1ZGVzIHRoZSBlc3RpbWF0ZSAoYikgYW5kIGEgOTUlIGNyZWRpYmxlIGludGVydmFsIGZvciB0aGF0IGVzdGltYXRlLiBBc3Rlcmlza3MgaW5kaWNhdGUgOTUlIGNyZWRpYmxlIGludGVydmFscyB0aGF0IGRvIG5vdCBpbmNsdWRlIDAuIikgJT4lICAKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgcm93X3NwZWMoYygxLCAzLCA1KSwgYm9sZCA9IFQpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBIRUFSVCIsIDEsIDIpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBNSU5EIiwgMywgNCkgJT4lCiAgZ3JvdXBfcm93cygiSEVBUlQgLSBNSU5EIiwgNSwgNikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICJBZHVsdHMiID0gMywKICAgICAgICAgICAgICAgICAgICAgIkNoaWxkcmVuLCA3LTl5ICh1c2luZyBhZHVsdHMnIHNjYWxlcykiID0gMywKICAgICAgICAgICAgICAgICAgICAgIkNoaWxkcmVuLCA3LTl5ICh1c2luZyB0aGVpciBvd24gc2NhbGVzKSIgPSAzKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CnRhYmxlNC40CmBgYAoKYGBge3J9CnRhYmxlNC41IDwtIHJlZ3RhYl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmICU+JQogIHNlbGVjdCgtcGFpciwgLXN0dWR5LCAtY29udGFpbnMoInMuZS4iKSkgJT4lCiAgbXV0YXRlKGIgPSBmb3JtYXQocm91bmQoYiwgMiksIG5zbWFsbCA9IDIpKSAlPiUKICByZW5hbWUoUGFyYW1ldGVyID0gcGFyYW0sCiAgICAgICAgIGA5NSUgQ0lgID0gQ0k5NSkgJT4lCiAgcmVuYW1lX2FsbChmdW5zKGdzdWIoIm5vbnplcm8iLCAiICIsIC4pKSkgJT4lCiAga2FibGUoZm9ybWF0ID0gImh0bWwiLCBhbGlnbiA9IGMoImwiLCByZXAoYyhyZXAoInIiLCAyKSwgImwiKSwgMykpLCAKICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDQuNTogUmVncmVzc2lvbiBhbmFseXNlcyBvZiBkaWZmZXJlbmNlcyBpbiBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIFVTIGFkdWx0cyBhbmQgY2hpbGRyZW4gKDctOXkgb2YgYWdlKSBpbiBTdHVkeSAyLiBUaGUgdGFibGUgcHJlc2VudHMgcmVzdWx0cyBmcm9tIHNlcGFyYXRlIEJheWVzaWFuIHJlZ3Jlc3Npb25zIG9mIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChCT0RZIHZzLiBIRUFSVCwgQk9EWSB2cy4gTUlORCwgYW5kIEhFQVJUIHZzLiBNSU5EKS4gRWFjaCByZWdyZXNzaW9uIGluY2x1ZGVkIGZvdXIgZml4ZWQgZWZmZWN0IHBhcmFtZXRlcnM6ICgxKSB0aGUgaW50ZXJjZXB0IGFtb25nIGFkdWx0cywgd2hpY2ggSSB0cmVhdCBhcyBhbiBpbmRleCBvZiB0aGUgYXN5bW1ldHJ5IGluIGF0dHJpYnV0aW9ucyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgaW4gcXVlc3Rpb24gYW1vbmcgYWR1bHRzOyAoMikgdGhlIG92ZXJhbGwgZGlmZmVyZW5jZSBiZXR3ZWVuIGNoaWxkcmVuIGFuZCBhZHVsdHMgKGNvbGxhcHNpbmcgYWNyb3NzIHRhcmdldCBjaGFyYWN0ZXJzKTsgKDMpIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzIGFtb25nIGFkdWx0cywgcmVwb3J0ZWQgaGVyZSBhcyBhIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcm9ib3QgYW5kIHRoZSBncmFuZCBtZWFuIChHTSk7IGFuZCAoNCkgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhpcyBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMgYW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYWdlIGdyb3Vwcy4gVGhlIGRldmVsb3BtZW50YWwgY29tcGFyaXNvbnMgYXJlIGhpZ2hsaWdodGVkIGluIGJvbGQsIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBwcmltYXJ5IHBhcmFtZXRlcnMgb2YgaW50ZXJlc3QgZm9yIHRoZXNlIGFuYWx5c2VzLiBGb3IgZWFjaCBwYXJhbWV0ZXIsIHRoZSB0YWJsZSBpbmNsdWRlcyB0aGUgZXN0aW1hdGUgKGIpIGFuZCBhIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBmb3IgdGhhdCBlc3RpbWF0ZS4gQXN0ZXJpc2tzIGluZGljYXRlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbHMgdGhhdCBkbyBub3QgaW5jbHVkZSAwLiIpICU+JSAgCiAga2FibGVfc3R5bGluZygpICU+JQogIHJvd19zcGVjKHNlcSgyLCAxMiwgMiksIGJvbGQgPSBUKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIC0gSEVBUlQiLCAxLCA0KSAlPiUKICBncm91cF9yb3dzKCJCT0RZIC0gTUlORCIsIDUsIDgpICU+JQogIGdyb3VwX3Jvd3MoIkhFQVJUIC0gTUlORCIsIDksIDEyKSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwKICAgICAgICAgICAgICAgICAgICAgIkRldmVsb3BtZW50YWwgY29tcGFyaXNvbiIgPSAzKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CnRhYmxlNC41CmBgYAoKCiMgU3R1ZHkgMzogQ29uY2VwdHVhbCBjaGFuZ2Ugb3ZlciBlYXJseSBhbmQgbWlkZGxlIGNoaWxkaG9vZCAoNC05eSkKClN0dWR5IDMgYnVpbGRzIG9uIHRoZSBpbnZlc3RpZ2F0aW9uIG9mIG1pZGRsZSBjaGlsZGhvb2QgKDctOXkpIGluaXRpYXRlZCBpbiBTdHVkeSAyIGFuZCBleHRlbmRzIHRoaXMgZXhwbG9yYXRpb24gb2YgY29uY2VwdHVhbCBjaGFuZ2UgaW50byBlYXJsaWVyIGNoaWxkaG9vZCAoNC02eSkuIEluIHRoaXMgY2hhcHRlciwgSSBhZ2FpbiBmb2N1cyBvbiB3aGF0IHRoaXMgc3R1ZHkgY2FuIHJldmVhbCBhYm91dCBjaGFuZ2VzIGluIHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBjb25jZXB0dWFsIHVuaXRzIEJPRFksIEhFQVJULCBhbmQgTUlORCBvdmVyIHRoZSBjb3Vyc2Ugb2YgZWFybHkgYW5kIG1pZGRsZSBjaGlsZGhvb2QgKDctOXkpLiAKCkFzIGEgcmVtaW5kZXIsIGluIHRoZSBtYWluIHRleHQgb2YgdGhpcyBjaGFwdGVyIEkgYW5hbHl6ZSBjaGlsZHJlbidzIHJlc3BvbnNlcyB3aXRoIHJlc3BlY3QgdG8gdGhlICJtYXR1cmUiIGNvbmNlcHR1YWwgdW5pdHMgQk9EWSwgSEVBUlQsIGFuZCBNSU5ELCBhcyBkZWZpbmVkIGJ5IEVGQSBvZiBfYWR1bHRzJ18gcmVzcG9uc2VzLiAoU2VlIFtYWCBBUFBFTkRJWCBCP10gZm9yIGZ1cnRoZXIgYW5hbHlzZXMgd2l0aCByZXNwZWN0IHRvIHRoZSBjb25jZXB0dWFsIHVuaXRzIGlkZW50aWZpZWQgdGhyb3VnaCBFRkEgb2YgY2hpbGRyZW4ncyBvd24gbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucywgYXMgcHJlc2VudGVkIGluIENoYXB0ZXIgSUlJLikKCkluIFN0dWR5IDMsIGByIG5yb3coZDNfYWRfd2lkZSlgIFVTIGFkdWx0cywgYHIgbnJvdyhkM183OV93aWRlKWAgIm9sZGVyIiBjaGlsZHJlbiAoYHIgc3VtbWFyeShkM183OSRhZ2UpWyJNaW4uIl0gJT4lIHJvdW5kKDIpICU+JSBmb3JtYXQobnNtYWxsID0gMilgLWByIHN1bW1hcnkoZDNfNzkkYWdlKVsiTWF4LiJdICU+JSByb3VuZCgyKSAlPiUgZm9ybWF0KG5zbWFsbCA9IDIpYCB5ZWFyczsgbWVkaWFuOiBgciBzdW1tYXJ5KGQzXzc5JGFnZSlbIk1lZGlhbiJdICU+JSByb3VuZCgyKSAlPiUgZm9ybWF0KG5zbWFsbCA9IDIpYHkpLCBhbmQgYHIgbnJvdyhkM180Nl93aWRlKWAgInlvdW5nZXIiIGNoaWxkcmVuIChgciBzdW1tYXJ5KGQzXzQ2JGFnZSlbIk1pbi4iXSAlPiUgcm91bmQoMikgJT4lIGZvcm1hdChuc21hbGwgPSAyKWAtYHIgc3VtbWFyeShkM180NiRhZ2UpWyJNYXguIl0gJT4lIHJvdW5kKDIpICU+JSBmb3JtYXQobnNtYWxsID0gMilgIHllYXJzOyBtZWRpYW46IGByIHN1bW1hcnkoZDNfNDYkYWdlKVsiTWVkaWFuIl0gJT4lIHJvdW5kKDIpICU+JSBmb3JtYXQobnNtYWxsID0gMilgeSkgZWFjaCBhc3Nlc3NlZCBhIHNpbmdsZSB0YXJnZXQgY2hhcmFjdGVyIG9uIDIwIG1lbnRhbCBjYXBhY2l0aWVzLiBUaGlzIHN0dWR5IGVtcGxveWVkIHRoZSAiZGl2ZXJzZSBjaGFyYWN0ZXJzIiB2YXJpYW50IG9mIHRoZSBnZW5lcmFsIGFwcHJvYWNoLCB3aXRoIHBhcnRpY2lwYW50cyByYW5kb21seSBvciBwc2V1ZG8tcmFuZG9tbHkgYXNzaWduZWQgdG8gYXNzZXNzIG9uZSBvZiB0aGUgZm9sbG93aW5nIDkgY2hhcmFjdGVyczogYW4gZWxlcGhhbnQsIGEgZ29hdCwgYSBtb3VzZSwgYSBiaXJkLCBhIGJlZXRsZSwgYSB0ZWRkeSBiZWFyLCBhIGRvbGwsIGEgcm9ib3QsIG9yIGEgY29tcHV0ZXIuIChTZWUgQ2hhcHRlciBJSSBmb3IgZGV0YWlsZWQgbWV0aG9kcy4pCgojIyBSZXN1bHRzCgojIyMgQWR1bHRzCgojIyMjIFNjYWxlIGNvbnN0cnVjdGlvbgoKYGBge3J9CnNjYWxlc19lZmFfd2RtX2QzX2FkIDwtIHNjYWxlX2Z1bihlZmFfd2RtX2QzX2FkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QzX2FkKQpkM19hZF9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQzX2FkLCBzY2FsZXNfZWZhX3dkbV9kM19hZCkKCnNhdmVSRFMoc2NhbGVzX2VmYV93ZG1fZDNfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NhbGVzL3NjYWxlc19lZmFfd2RtX2QzX2FkIikKc2F2ZVJEUyhkM19hZF9zY29yZWRfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NvcmVkX2RhdGEvZDNfYWRfc2NvcmVkX2FkIikKYGBgCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiB0aGUgIkdlbmVyYWwgYW5hbHlzaXMgcGxhbiwiIGFib3ZlLCB5aWVsZGVkIGByIGZhY3RfbmFtZV9mdW4oZmFjdG9yX25hbWVzX2VmYV93ZG1fZDNfYWQpYCBzY2FsZXMgb2YgYHIgc2NhbGVzX2VmYV93ZG1fZDNfYWQgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpYCBpdGVtcyBlYWNoOyBzZWUgVGFibGUgNC4xMC4KCiMjIyMgVmlzdWFsaXphdGlvbiBhbmQgYW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKCmBgYHtyfQpwbG90c19kM19hZF9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkM19hZF9zY29yZWRfYWQsIGNvbG9ycyA9IGNvbG9yczA5KQpgYGAKCmBgYHtyfQpmaWdfZDNfYWRfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QzX2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QzX2FkX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QzX2FkX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlnX2QzX2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QzX2FkX3Njb3JlZF9hZFtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIAogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDksCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSA5KSkpCgpmaWdfZDNfYWRfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWdfZDNfYWRfcGxvdHMsIGZpZ19kM19hZF9sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDNfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAzOiBBZHVsdHMiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2QzX2FkX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoZmlnX2QzX2FkX3RpdGxlLCBmaWdfZDNfYWRfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCmZpZ19kM19hZF9wbG90c19sZWdfdGl0bGUKYGBgCgpgYGB7cn0KZDNfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9mdW4oZDNfYWRfc2NvcmVkX2FkKQpjb250cmFzdHMoZDNfYWRfc2NvcmVkX2FkX2RpZmYkY2hhcmFjdGVyKSA8LSBjb250cmFzdHNfc3VtX2R2MDkKCnNhdmVSRFMoZDNfYWRfc2NvcmVkX2FkX2RpZmYsICIuL3N0b3JlZC9kaWZmc2NvcmVfZGF0YS9kM19hZF9zY29yZWRfYWRfZGlmZiIpCmBgYAoKYGBge3J9CnBsb3RfZDNfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQzX2FkX3Njb3JlZF9hZF9kaWZmLCBjb2xvcnMgPSBjb2xvcnMwOSkKYGBgCgpgYGB7cn0KIyByX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDNfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKcl9kM19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpzdW1tYXJ5KHJfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkM19hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpyX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpzdW1tYXJ5KHJfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDNfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkM19hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kM19hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpyX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM19hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnN1bW1hcnkocl9kM19hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCmBgYHtyfQpyZWd0YWJfZDNfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9yZWdfdGFibGVfZnVuKAogIHJlZ19saXN0ID0gbGlzdChyX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiAgICAgICAgICAgICAgICAgIHJfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAogICAgICAgICAgICAgICAgICByX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpLAogIHBhaXJfbGlzdCA9IGMoIkJPRFkgLSBIRUFSVCIsICJCT0RZIC0gTUlORCIsICJIRUFSVCAtIE1JTkQiKSwKICBzdHVkeV9uYW1lID0gIkFkdWx0cyIsCiAgY2hhcl9sYWJlbCA9IGMoIkVsZXBoYW50IHZzLiBHTSIsICJHb2F0IHZzLiBHTSIsICJNb3VzZSB2cy4gR00iLAogICAgICAgICAgICAgICAgICJCaXJkIHZzLiBHTSIsICJCZWV0bGUgdnMuIEdNIiwgIlRlZGR5IGJlYXIgdnMuIEdNIiwKICAgICAgICAgICAgICAgICAiRG9sbCB2cy4gR00iLCAiUm9ib3QgdnMuIEdNIikpCmBgYAoKYGBge3J9CiMgaW50ZXJpbSB0YWJsZSBmb3IgZWFzZSBvZiB3cml0aW5nCnJlZ3RhYl9kM19hZF9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgZmlsdGVyKHBhcmFtID09ICJJbnRlcmNlcHQiKSAlPiUKICBrYWJsZShkaWdpdHMgPSAyKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpwbG90X2QzX2FkX3Njb3JlZF9hZF9kaWZmCmBgYAoKVmlzdWFsaXphdGlvbnMgb2YgcmVsYXRpb25zaGlwcyBhbW9uZyBzY29yZXMgb24gdGhlc2UgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyBhcmUgcHJvdmlkZWQgaW4gRmlndXJlIDQuNiwgcm93IEEuIEhlcmUgSSBjb21iaW5lIG15IGluZm9ybWFsIGRlc2NyaXB0aW9ucyBvZiB0aGVzZSB2aXN1YWxpemF0aW9ucyB3aXRoIGZvcm1hbCBhbmFseXNlcyBvZiBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIGNvbmNlcHR1YWwgdW5pdHMsIGNvbnRyb2xsaW5nIGZvciBkaWZmZXJlbmNlcyBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgbmluZSAiZGl2ZXJzZSBjaGFyYWN0ZXJzIiB0aGF0IHdlcmUgZmVhdHVyZWQgYXMgdGFyZ2V0IGNoYXJhY3RlcnMgaW4gdGhlc2Ugc3R1ZGllcy4gU2VlIEZpZ3VyZSA0LjcsIHBhbmVsIEEsIGZvciB2aXN1YWwgZGVwaWN0aW9ucyBvZiB0aGVzZSBkaWZmZXJlbmNlIHNjb3JlcywgYW5kIFRhYmxlIDQuNiBmb3IgdGhlIGZ1bGwgcmVzdWx0cyBvZiB0aGVzZSBCYXllc2lhbiByZWdyZXNzaW9uIGFuYWx5c2VzLgoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkFzIGFtb25nIGFkdWx0cyBpbiBTdHVkaWVzIDEgYW5kIDIsIHR3byBzdHJpa2luZyBmZWF0dXJlcyBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk9EWSBhbmQgSEVBUlQgYW1vbmcgYWR1bHRzIGluIFN0dWR5IDMgKEZpZ3VyZSA0LjYsIHBhbmVsIEExKSBhcmUgdGhhdCBzY29yZXMgb24gdGhlc2Ugc2NhbGVzIHdlcmUgcG9zaXRpdmVseSBjb3JyZWxhdGVkIChgciBzY29yZV9jb3JfcHJpbnRfZnVuKGQzX2FkX3Njb3JlZF9hZCwgIkJPRFkgdnMuIEhFQVJUIilgKSwgYW5kIHZpcnR1YWxseSBubyBhZHVsdHMgYXR0cmlidXRlZCBtb3JlIEhFQVJUIHRoYW4gQk9EWSB0byB0aGUgdGFyZ2V0IGNoYXJhY3RlciB0aGV5IHdlcmUgYXNzaWduZWQgdG8gYXNzZXNzLiBBIHJlZ3Jlc3Npb24gYW5hbHlzaXMgY29uZmlybWVkIHRoYXQgX0JPRFlfIHZzLiBfSEVBUlRfIGRpZmZlcmVuY2Ugc2NvcmVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9CT0RZXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0hFQVJUXyBpdGVtcyAoc2VlIEZpZ3VyZSA0LjcsIHBhbmVsIEEsIGFuZCB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC42KS4gCgpUaGVzZSByZWdyZXNzaW9uIHJlc3VsdHMgYWxzbyBzdWdnZXN0IHRoYXQgdGhlIGFzeW1tZXRyeSBiZXR3ZWVuIEJPRFkgYW5kIEhFQVJUIHdhcyBwcmltYXJpbHkgZHJpdmVuIGJ5IHJlc3BvbnNlcyB0byB0aGUgYW5pbWF0ZSBiZWluZ3MgKHNlZSB0aGUgdmFyaW91cyBjb21wYXJpc29ucyBvZiB0YXJnZXQgY2hhcmFjdGVycyB0byB0aGUgZ3JhbmQgbWVhbiBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNi4pLiBJbmRlZWQsIHZpc3VhbCBpbnNwZWN0aW9uIG9mIG1lYW4gc2NvcmVzIGJ5IHRhcmdldCBjaGFyYWN0ZXIgKEZpZ3VyZSA0LjYsIHBhbmVsIEExKSByZXZlYWxzIGEgc3VpdGUgb2YgY2hhcmFjdGVyc+KAlG5hbWVseSwgaW5hbmltYXRlIG9iamVjdHPigJR0aGF0LCBpbiB0aGUgYWdncmVnYXRlLCByZWNlaXZlZCB2ZXJ5IGxvdyBfQk9EWV8gc2NvcmVzIGFuZCB2ZXJ5IGxvdyBfSEVBUlRfIHNjb3Jlcy4gVGhpcyBzdWl0ZSBvZiBjaGFyYWN0ZXJzIGFwcGVhcnMgdG8gYmUgZGlzdGluY3QgZnJvbSB0aGUgb3RoZXIgY2hhcmFjdGVyc+KAlGFsbCBhbmltYXRlIGJlaW5nc+KAlGFsbCBvZiB3aGljaCwgaW4gdGhlIGFnZ3JlZ2F0ZSwgcmVjZWl2ZWQgcmVsYXRpdmVseSBoaWdoIF9CT0RZXyBzY29yZXMsIGJ1dCB2YXJpZWQgaW4gdGhlaXIgbWVhbiBfSEVBUlRfIHNjb3Jlcy4gRWNob2luZyBTdHVkeSAxZCwgdGhpcyByYWlzZXMgdGhlIGludHJpZ3VpbmcgcG9zc2liaWxpdHkgdGhhdCBhZHVsdHMnIGF0dHJpYnV0aW9ucyBvZiBCT0RZIGFuZCBIRUFSVCBtYXkgaGF2ZSBiZWVuIGdvdmVybmVkIGJ5IHNvbWUgc29ydCBvZiAidGhyZXNob2xkIiBtb2RlbCwgaW4gd2hpY2ggYXR0cmlidXRpb25zIG9mIGFueSBzdWJzdGFudGlhbCBhbW91bnQgb2YgSEVBUlQgZGVwZW5kIG9uIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGhhdmluZyBhIGNlcnRhaW4gZGVncmVlIG9mIEJPRFkuIEl0IGlzIGFsc28gd29ydGggbm90aW5nIHRoYXQsIGV2ZW4gYW1vbmcgdGhpcyB3aWRlciByYW5nZSBvZiB0YXJnZXQgY2hhcmFjdGVycywgdGhlcmUgd2VyZSBubyBjaGFyYWN0ZXJzIGZvciB3aG9tIHRoZSBCT0RZLUhFQVJUIGFzeW1tZXRyeSB3YXMgc3lzdGVtYXRpY2FsbHkgcmV2ZXJzZWQgKGkuZS4sIHdobyB3ZXJlIGdlbmVyYWxseSBjb25zaWRlcmVkIHRvIGhhdmUgbW9yZSBIRUFSVCB0aGFuIEJPRFkgY2FwYWNpdGllcykuIAoKIyMjIyMgQk9EWSB2cy4gTUlORAoKQXMgYW1vbmcgYWR1bHRzIGluIFN0dWRpZXMgMSBhbmQgMiwgdHdvIHN0cmlraW5nIGZlYXR1cmVzIG9mIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBCT0RZIGFuZCBNSU5EIGFtb25nIGFkdWx0cyBpbiBTdHVkeSAzIChGaWd1cmUgNC42LCBwYW5lbCBBMikgYXJlIHRoYXQgc2NvcmVzIG9uIHRoZXNlIHNjYWxlcyB3ZXJlIHBvc2l0aXZlbHkgY29ycmVsYXRlZCAoYHIgc2NvcmVfY29yX3ByaW50X2Z1bihkM19hZF9zY29yZWRfYWQsICJCT0RZIHZzLiBNSU5EIilgKSwgYW5kIHZlcnkgZmV3IGFkdWx0cyBlbmRvcnNlZCBCT0RZIG11Y2ggbW9yZSBzdHJvbmdseSB0aGFuIE1JTkQgZm9yIHRoZSB0YXJnZXQgY2hhcmFjdGVyIHRoZXkgd2VyZSBhc3NpZ25lZCB0byBhc3Nlc3MgKGkuZS4sIHRoZXJlIHdlcmUgbm8gZGF0YXBvaW50cyBpbiB0aGUgbG93ZXIgcmlnaHQgY29ybmVyIG9mIHRoZSBwbG90KS4gQSByZWdyZXNzaW9uIGFuYWx5c2lzIGNvbmZpcm1lZCB0aGF0IF9CT0RZXyB2cy4gX01JTkRfIGRpZmZlcmVuY2Ugc2NvcmVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9NSU5EXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0JPRFlfIGl0ZW1zIChzZWUgRmlndXJlIDQuNywgcGFuZWwgQSwgYW5kIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNikuIAoKRWNob2luZyBTdHVkeSAxZCwgaG93ZXZlciwgdGhlIGFzeW1tZXRyeSBiZXR3ZWVuIEJPRFkgdnMuIE1JTkQgIHdhcyBvdmVyd2hlbG1pbmdseSBkcml2ZW4gYnkgcmVzcG9uc2VzIHRvIHRoZSB0d28gdGVjaG5vbG9naWVzIChwYXJ0aWN1bGFybHkgdGhlIHJvYm90KS4gQWR1bHRzIHdobyBhc3Nlc3NlZCBvbmUgb2YgdGhlIHRlY2hub2xvZ2llcyAoYSByb2JvdCBvciBhIGNvbXB1dGVyKSB0ZW5kZWQgdG8gZW5kb3JzZSB0aGUgbWVudGFsIGNhcGFjaXR5IGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfTUlORF8gc2NhbGUgcm91Z2hseSBhcyBzdHJvbmdseSwgYW5kIG9mdGVuIG1vcmUgc3Ryb25nbHksIHRoYW4gdGhleSBlbmRvcnNlZCBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX0JPRFlfIHNjYWxl4oCUYnV0IGFkdWx0cyB3aG8gYXNzZXNzZWQgb3RoZXIgdGFyZ2V0IGNoYXJhY3RlcnMsIGlmIGFueXRoaW5nLCBhcHBlYXIgdG8gaGF2ZSBzaG93biB0aGUgcmV2ZXJzZSBwYXR0ZXJuLCBlbmRvcnNpbmcgX01JTkRfIGl0ZW1zIHNsaWdodGx5IGxlc3Mgc3Ryb25nbHkgdGhhbiBfQk9EWV8gaXRlbXMuIChTZWUgRmlndXJlIDQuNywgcGFuZWwgQiwgYW5kIHRoZSB2YXJpb3VzIGNvbXBhcmlzb25zIG9mIHRhcmdldCBjaGFyYWN0ZXJzIHRvIHRoZSBncmFuZCBtZWFuIGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjYuKQoKIyMjIyMgSEVBUlQgdnMuIE1JTkQKCkFzIGFtb25nIGFkdWx0cyBpbiBTdHVkaWVzIDEgYW5kIDIsIHR3byBzdHJpa2luZyBmZWF0dXJlcyBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gSEVBUlQgYW5kIE1JTkQgYW1vbmcgYWR1bHRzIGluIFN0dWR5IDMgKEZpZ3VyZSA0LjYsIHBhbmVsIEEzKSBhcmUgdGhhdCBzY29yZXMgb24gdGhlc2Ugc2NhbGVzIHdlcmUgcG9zaXRpdmVseSBjb3JyZWxhdGVkIChgciBzY29yZV9jb3JfcHJpbnRfZnVuKGQzX2FkX3Njb3JlZF9hZCwgIkhFQVJUIHZzLiBNSU5EIilgKSwgYW5kIHZpcnR1YWxseSBubyBhZHVsdHMgYXR0cmlidXRlZCBtb3JlIEhFQVJUIHRoYW4gTUlORCB0byB0aGUgdGFyZ2V0IGNoYXJhY3RlciB0aGV5IHdlcmUgYXNzaWduZWQgdG8gYXNzZXNzLiBBIHJlZ3Jlc3Npb24gYW5hbHlzaXMgY29uZmlybWVkIHRoYXQgX0hFQVJUXyB2cy4gX01JTkRfIGRpZmZlcmVuY2Ugc2NvcmVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9NSU5EXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0hFQVJUXyBpdGVtcyAoc2VlIEZpZ3VyZSA0LjcsIHBhbmVsIEEsIGFuZCB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC42KS4gCgpNdWNoIGxpa2UgdGhlIEJPRFktSEVBUlQgY29tcGFyaXNvbiwgdGhlc2UgcmVncmVzc2lvbiByZXN1bHRzIGFsc28gc3VnZ2VzdCB0aGF0IHRoZSBhc3ltbWV0cnkgYmV0d2VlbiBIRUFSVCBhbmQgTUlORCB3YXMgbW9yZSBwcm9ub3VuY2VkIGZvciBzb21lIGNoYXJhY3RlcnMgdGhhbiBvdGhlcnMsIGFuZCBwYXJ0aWN1bGFybHkgd2VhayBmb3IgdGhlIHR3byBpbmVydCBvYmplY3RzICh0aGUgdGVkZHkgYmVhciBhbmQgdGhlIGRvbGw7IHNlZSBGaWd1cmUgNywgcGFuZWwgQywgYW5kIHRoZSB2YXJpb3VzIGNvbXBhcmlzb25zIG9mIHRhcmdldCBjaGFyYWN0ZXJzIHRvIHRoZSBncmFuZCBtZWFuIGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC42LikuIEluZGVlZCwgdmlzdWFsIGluc3BlY3Rpb24gb2YgbWVhbiBzY29yZXMgYnkgdGFyZ2V0IGNoYXJhY3RlciAoRmlndXJlIDQuNiwgcGFuZWwgQTMpIHN1Z2dlc3RzIHRoYXQsIGluIHRoZSBhZ2dyZWdhdGUsIGNoYXJhY3RlcnMgdGhhdCByZWNlaXZlZCBsb3cgX01JTkRfIHNjb3JlcyBhbHNvIHJlY2VpdmVkIGxvdyBtZWFuIF9IRUFSVF8gc2NvcmVzLCB3aGlsZSBjaGFyYWN0ZXJzIHRoYXQgcmVjZWl2ZWQgcmVsYXRpdmVseSBoaWdoIF9NSU5EXyBzY29yZXMgKGUuZy4sIHRoZSByb2JvdCBhbmQgYWxsIG9mIHRoZSBhbmltYXRlIGJlaW5ncykgdmFyaWVkIGluIHRoZWlyIG1lYW4gX0hFQVJUXyBzY29yZXMuIEFnYWluLCB0aGlzIGVjaG9lcyB0aGUgaW50cmlndWluZyBwb3NzaWJpbGl0eSwgcmFpc2VkIGJ5IFN0dWR5IDFkLCB0aGF0IGF0dHJpYnV0aW9ucyBvZiBIRUFSVCBhbmQgTUlORCBtYXkgaGF2ZSBiZWVuIGdvdmVybmVkIGJ5IHNvbWUgc29ydCBvZiAidGhyZXNob2xkIiBtb2RlbCwgaW4gd2hpY2ggYXR0cmlidXRpb25zIG9mIGFueSBzdWJzdGFudGlhbCBhbW91bnQgb2YgSEVBUlQgZGVwZW5kIG9uIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGhhdmluZyBhIGNlcnRhaW4gZGVncmVlIG9mIE1JTkQuCgojIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKQW1vbmcgYWR1bHRzIGluIFN0dWR5IDMsIGJvdGggaW5mb3JtYWwgb2JzZXJ2YXRpb25zIGFuZCBmb3JtYWwgYW5hbHlzZXMgcmV2ZWFsZWQgdmVyeSBzaW1pbGFyIHJlc3VsdHMgdG8gU3R1ZGllcyAxIGFuZCAy4oCUbmFtZWx5LCBwb3NpdGl2ZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gY29uY2VwdHVhbCB1bml0cyB0aGF0IHdlcmUgZnVydGhlciBjaGFyYWN0ZXJpemVkIGJ5IHN5c3RlbWF0aWMgYXN5bW1ldHJpZXMsIHdpdGggcGFydGljaXBhbnRzIGVuZG9yc2luZyBCT0RZIGFuZCBNSU5EIGF0IGxlYXN0IGFzIHN0cm9uZ2x5LCBhbmQgb2Z0ZW4gbW9yZSBzdHJvbmdseSwgdGhhbiBIRUFSVC4gQXMgaW4gU3R1ZHkgMWTigJR0aGUgb25seSBvdGhlciBzdHVkeSB0aGF0IGVtcGxveWVkIHRoZSAiZGl2ZXJzZSBjaGFyYWN0ZXJzIiBhcHByb2FjaCBlbXBsb3llZCBpbiBTdHVkeSAz4oCUdGhlIGFzeW1tZXRyeSBiZXR3ZWVuIEJPRFkgdnMuIE1JTkQgYXBwZWFyZWQgdG8gYmUgc29tZXdoYXQgd2Vha2VyIGFuZCBtb3JlIHZhcmlhYmxlIGFjcm9zcyBwYXJ0aWNpcGFudHMgYW5kIHRhcmdldCBjaGFyYWN0ZXJzLgoKIyMjIENoaWxkcmVuICg3LTl5KQoKQW1vbmcgY2hpbGRyZW4gaW4gU3R1ZHkgMiwgdGhlIGFzeW1tZXRyaWNhbCByZWxhdGlvbnNoaXBzIGFtb25nIEJPRFksIEhFQVJULCBhbmQgTUlORCBhcHBlYXJlZCB0byBiZSBzaW1pbGFyIGluIGRpcmVjdGlvbiBidXQgd2Vha2VyIGluIHN0cmVuZ3RoIHRvIHRob3NlIG9mIGFkdWx0c+KAlHdpdGggdGhlIHBvc3NpYmxlIGV4Y2VwdGlvbiBvZiB0aGUgQk9EWSB2cy4gSEVBUlQgY29tcGFyaXNvbiwgZm9yIHdoaWNoIGNoaWxkcmVuJ3MgcmVzcG9uc2VzIHJldmVhbGVkIG5vIHN5c3RlbWF0aWMgYXN5bW1ldHJ5LiBTdHVkeSAzIHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IHRvIHJlYXNzZXNzIHRoZXNlIHJlbGF0aW9uc2hpcHMgaW4gYSBuZXcgc2FtcGxlIG9mIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gKHVzaW5nIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGV4cGVyaW1lbnRhbCBwYXJhZGlnbSkuCgpgYGB7cn0KIyBqdXN0IGZvciB0YWJsZQpzY2FsZXNfZWZhX3dkbV9kM183OSA8LSBzY2FsZV9mdW4oZWZhX3dkbV9kM183OSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfZWZhX3dkbV9kM183OSkKc2F2ZVJEUyhzY2FsZXNfZWZhX3dkbV9kM183OSwgZmlsZSA9ICIuL3N0b3JlZC9zY2FsZXMvc2NhbGVzX2VmYV93ZG1fZDNfNzkiKQpgYGAKCmBgYHtyfQpkM183OV9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQzXzc5LCBzY2FsZXNfZWZhX3dkbV9kM19hZCkKc2F2ZVJEUyhkM183OV9zY29yZWRfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NvcmVkX2RhdGEvZDNfNzlfc2NvcmVkX2FkIikKYGBgCgojIyMjIFZpc3VhbGl6YXRpb24gYW5kIGFuYWx5c2lzIG9mIGFzeW1tZXRyaWVzCgpgYGB7cn0KcGxvdHNfZDNfNzlfc2NvcmVkX2FkIDwtIHJlbHZpel9mdW4oZDNfNzlfc2NvcmVkX2FkLCBjb2xvcnMgPSBjb2xvcnMwOSkKYGBgCgpgYGB7cn0KZmlnX2QzXzc5X3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kM183OV9zY29yZWRfYWRbWzFdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kM183OV9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kM183OV9zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCMSIsICJCMiIsICJCMyIpLCBuY29sID0gMykKCmZpZ19kM183OV9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19kM183OV9zY29yZWRfYWRbWzFdXSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCAKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpKQoKZmlnX2QzXzc5X3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlnX2QzXzc5X3Bsb3RzLCBmaWdfZDNfNzlfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2QzXzc5X3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgMzogQ2hpbGRyZW4sIDctOXkgKHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDNfNzlfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDNfNzlfdGl0bGUsIGZpZ19kM183OV9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKZmlnX2QzXzc5X3Bsb3RzX2xlZ190aXRsZQpgYGAKCmBgYHtyfQpkM183OV9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX2Z1bihkM183OV9zY29yZWRfYWQpCmNvbnRyYXN0cyhkM183OV9zY29yZWRfYWRfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZHYwOQoKc2F2ZVJEUyhkM183OV9zY29yZWRfYWRfZGlmZiwgIi4vc3RvcmVkL2RpZmZzY29yZV9kYXRhL2QzXzc5X3Njb3JlZF9hZF9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kM183OV9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDNfNzlfc2NvcmVkX2FkX2RpZmYsIGNvbG9ycyA9IGNvbG9yczA5KQpgYGAKCmBgYHtyfQojIHJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkM183OV9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpyX2QzXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnN1bW1hcnkocl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQzXzc5X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnN1bW1hcnkocl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kM183OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQzXzc5X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QzXzc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM183OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzXzc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKc3VtbWFyeShyX2QzXzc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kM183OV9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX3JlZ190YWJsZV9mdW4oCiAgcmVnX2xpc3QgPSBsaXN0KHJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKICAgICAgICAgICAgICAgICAgcl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCksCiAgcGFpcl9saXN0ID0gYygiQk9EWSAtIEhFQVJUIiwgIkJPRFkgLSBNSU5EIiwgIkhFQVJUIC0gTUlORCIpLAogIHN0dWR5X25hbWUgPSAiQ2hpbGRyZW4sIDctOXkgKHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsCiAgY2hhcl9sYWJlbCA9IGMoIkVsZXBoYW50IHZzLiBHTSIsICJHb2F0IHZzLiBHTSIsICJNb3VzZSB2cy4gR00iLAogICAgICAgICAgICAgICAgICJCaXJkIHZzLiBHTSIsICJCZWV0bGUgdnMuIEdNIiwgIlRlZGR5IGJlYXIgdnMuIEdNIiwKICAgICAgICAgICAgICAgICAiRG9sbCB2cy4gR00iLCAiUm9ib3QgdnMuIEdNIikpCmBgYAoKYGBge3J9CiMgaW50ZXJpbSB0YWJsZSBmb3IgZWFzZSBvZiB3cml0aW5nCnJlZ3RhYl9kM183OV9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgZmlsdGVyKHBhcmFtID09ICJJbnRlcmNlcHQiKSAlPiUKICBrYWJsZShkaWdpdHMgPSAyKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpwbG90X2QzXzc5X3Njb3JlZF9hZF9kaWZmCmBgYAoKVmlzdWFsaXphdGlvbnMgb2YgcmVsYXRpb25zaGlwcyBhbW9uZyA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuJ3Mgc2NvcmVzIG9uIHRoZSBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzIGFyZSBwcm92aWRlZCBpbiBGaWd1cmUgNC42LCByb3cgQi4gSGVyZSBJIGNvbWJpbmUgbXkgaW5mb3JtYWwgZGVzY3JpcHRpb25zIG9mIHRoZXNlIHZpc3VhbGl6YXRpb25zIHdpdGggZm9ybWFsIGFuYWx5c2VzIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gY29uY2VwdHVhbCB1bml0cywgY29udHJvbGxpbmcgZm9yIGRpZmZlcmVuY2VzIGluIGFzc2Vzc21lbnRzIG9mIHRoZSBuaW5lICJkaXZlcnNlIGNoYXJhY3RlcnMiIHRoYXQgd2VyZSBmZWF0dXJlZCBhcyB0YXJnZXQgY2hhcmFjdGVycyBpbiB0aGVzZSBzdHVkaWVzLiBTZWUgRmlndXJlIDQuNywgcGFuZWwgQiwgZm9yIHZpc3VhbCBkZXBpY3Rpb25zIG9mIHRoZXNlIGRpZmZlcmVuY2Ugc2NvcmVzLCBhbmQgVGFibGUgNC42IGZvciB0aGUgZnVsbCByZXN1bHRzIG9mIHRoZXNlIEJheWVzaWFuIHJlZ3Jlc3Npb24gYW5hbHlzZXMuCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKQXMgYW1vbmcgYWR1bHRzIGluIHRoaXMgc3R1ZHksIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuJ3Mgc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzIChGaWd1cmUgNC42LCBwYW5lbCBCMSkgd2FzIHBvc2l0aXZlIChgciBzY29yZV9jb3JfcHJpbnRfZnVuKGQzXzc5X3Njb3JlZF9hZCwgIkJPRFkgdnMuIEhFQVJUIilgKSwgYW5kIHRoZXJlIHdlcmUgc29tZXdoYXQgZmV3ZXIgZGF0YXBvaW50cyBiZWxvdyB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpIHRoYW4gYWJvdmUgaXQuIEluIGNvbnRyYXN0IHRvIFN0dWR5IDIsIHRoaXMgYXN5bW1ldHJ5IHdhcyBzdHJvbmcgZW5vdWdoIGluIHRoaXMgc2FtcGxlIG9mIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gdG8gYmUgZGlzdGluZ3Vpc2hhYmxlIGZyb20gemVybyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjYpLCBhbHRob3VnaCB0aGUgYXN5bW1ldHJ5IHN0aWxsIGFwcGVhcnMgdG8gaGF2ZSBiZWVuIHdlYWtlciB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIGFzeW1tZXRyeSBpbiBhZHVsdHMuCgpUaGlzIGFuYWx5c2lzIGZ1cnRoZXIgcmV2ZWFsZWQgdGhhdCwgYXMgYW1vbmcgYWR1bHRzLCB0aGlzIGFzeW1tZXRyeSBiZXR3ZWVuIF9CT0RZXyB2cy4gX0hFQVJUXyBzY29yZXMgd2FzIGRyaXZlbiBieSBjaGlsZHJlbidzIGFzc2Vzc21lbnRzIG9mIHRoZSBhbmltYXRlIGJlaW5ncyAoc2VlIHRoZSB2YXJpb3VzIGNvbXBhcmlzb25zIG9mIHRhcmdldCBjaGFyYWN0ZXJzIHRvIHRoZSBncmFuZCBtZWFuIGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC42LikuIEluZGVlZCwgZm9yIG9uZSB0YXJnZXQgY2hhcmFjdGVyIG9mIHBhcnRpY3VsYXIgaW50ZXJlc3TigJR0aGUgcm9ib3TigJR0aGUgYXN5bW1ldHJ5IHJhbiBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uOiBJbiB0aGUgYWdncmVnYXRlLCBjaGlsZHJlbiBhcHBlYXIgdG8gaGF2ZSBhdHRyaWJ1dGVkIG1vcmUgSEVBUlQgdGhhbiBCT0RZIHRvIHRoaXMgdW51c3VhbCBzb2NpYWwgcGFydG5lci4gVGhpcyBhbGlnbnMgd2l0aCB0aGlzIGFnZSBncm91cCdzIHJlc3BvbnNlcyB0byB0aGUgcm9ib3QgaW4gU3R1ZHkgMuKAlGFuZCBzdGFuZHMgaW4gY29udHJhc3QgdG8gYWR1bHRzLCBhbW9uZyB3aG9tIHRoZXJlIHdlcmUgbm8gY2hhcmFjdGVycyB3aG8gZWxpY2l0ZWQgYW4gYXN5bW1ldHJ5IGluIHRoaXMgZGlyZWN0aW9uLgoKRWNob2luZyB0aGUgdmlzdWFsaXphdGlvbnMgb2YgYWR1bHRzJyByZXNwb25zZXMgaW4gdGhpcyBzdHVkeSwgdGhlcmUgZG8gYXBwZWFyIHRvIGJlIHR3byBzdWl0ZXMgb2YgY2hhcmFjdGVycyBpbiB0aGlzIHZpc3VhbGl6YXRpb24gb2YgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbidzIHJlc3BvbnNlcyAoRmlndXJlIDQuNiwgcGFuZWwgQjEpOiBpbmFuaW1hdGUgb2JqZWN0cyAoY2hhcmFjdGVyaXplZCBieSBnZW5lcmFsbHkgbG93IF9CT0RZXyBzY29yZXMpIGFuZCBhbmltYXRlIGJlaW5ncyAoY2hhcmFjdGVyaXplZCBieSBnZW5lcmFsbHkgaGlnaCBfQk9EWV8gc2NvcmVzKS4gSG93ZXZlciwgd2hpbGUgYW1vbmcgYWR1bHRzIG9ubHkgYW5pbWF0ZSBiZWluZ3MgdmFyaWVkIGluIHRoZWlyIG1lYW4gX0hFQVJUXyBzY29yZXMsIGFtb25nIGNoaWxkcmVuIHRoZXJlIGFwcGVhcnMgdG8gYmUgc3Vic3RhbnRpYWwgdmFyaWFiaWxpdHkgaW4gX0hFQVJUXyBzY29yZXMgaW4gYm90aCBvZiB0aGVzZSBncm91cHMgb2YgY2hhcmFjdGVycy4gSW4gb3RoZXIgd29yZHMsIHRoaXMgdmlzdWFsaXphdGlvbiBkb2VzIG5vdCBwcm92aWRlIGV2aWRlbmNlIG9mIHRoZSBraW5kIG9mICJ0aHJlc2hvbGQiIG1vZGVsIHRoYXQgbWlnaHQgZ292ZXJuIGFkdWx0cycgcmVzcG9uc2VzLgoKIyMjIyMgQk9EWSB2cy4gTUlORAoKQW1vbmcgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiwgYXMgYW1vbmcgYWR1bHRzIGluIHRoaXMgc3R1ZHksIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzY29yZXMgb24gdGhlIF9CT0RZXyBhbmQgX01JTkRfIHNjYWxlcyB3YXMgcG9zaXRpdmUgKGByIHNjb3JlX2Nvcl9wcmludF9mdW4oZDNfNzlfc2NvcmVkX2FkLCAiQk9EWSB2cy4gTUlORCIpYCkuIEluIGNvbnRyYXN0IHRvIGFkdWx0cywgaG93ZXZlciwgY2hpbGRyZW4gc2hvd2VkIG5vIGV2aWRlbmNlIG9mIGFzeW1tZXRyeSBpbiB0aGVpciBfQk9EWV8gdnMuIF9NSU5EXyBzY29yZXM6IFRoZWlyIGRpZmZlcmVuY2Ugc2NvcmVzIHdlcmUgbm90IHN1YnN0YW50aWFsbHkgZGlmZmVyZW50IGZyb20gemVybyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNiksIGFuZCBpdCBpcyBjbGVhciBmcm9tIHRoZSB2aXN1YWxpemF0aW9uIHRoYXQgc29tZSBjaGlsZHJlbiBhdHRyaWJ1dGVkIG1vcmUgTUlORCB0aGFuIEJPRFkgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24gKHBhcnRpY3VsYXJseSBpZiB0aGV5IHdlcmUgZXZhbHVhdGluZyBvbmUgb2YgdGhlIHR3byB0ZWNobm9sb2dpZXMpLCBidXQgb3RoZXJzIGF0dHJpYnV0ZWQgbW9yZSBCT0RZIHRoYW4gTUlORCAocGFydGljdWxhcmx5IGlmIHRoZXkgd2VyZSBldmFsdWF0aW5nIG9uZSBvZiBhbmltYXRlIGJlaW5ncykuIFN1Y2ggYmV0d2Vlbi1jaGFyYWN0ZXIgZGlmZmVyZW5jZXMgYXBwZWFyIHRvIGJlIGV2ZW4gbW9yZSBwcm9ub3VuY2VkIGFtb25nIGNoaWxkcmVuIHRoYW4gdGhleSB3ZXJlIGFtb25nIGFkdWx0cyAoc2VlIEZpZ3VyZSA0LjcsIHBhbmVsIEIyLCBhbmQgdGhlIHZhcmlvdXMgY29tcGFyaXNvbnMgb2YgdGFyZ2V0IGNoYXJhY3RlcnMgdG8gdGhlIGdyYW5kIG1lYW4gZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNi4pCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKQXMgYW1vbmcgYWR1bHRzIGluIHRoaXMgc3R1ZHksIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuJ3Mgc2NvcmVzIG9uIHRoZSBfSEVBUlRfIGFuZCBfTUlORF8gc2NhbGVzIHdhcyBwb3NpdGl2ZSAoYHIgc2NvcmVfY29yX3ByaW50X2Z1bihkM183OV9zY29yZWRfYWQsICJIRUFSVCB2cy4gTUlORCIpYCksIGFuZCBjaGlsZHJlbidzIGRpZmZlcmVuY2Ugc2NvcmVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBzdHJvbmdlciBlbmRvcnNlbWVudHMgZm9yIF9NSU5EXyBpdGVtcyBjb21wYXJlZCB0byBfSEVBUlRfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNikuIEFnYWluLCBob3dldmVyLCB0aGlzIGFzeW1tZXRyeSB3YXMgbXVjaCBsZXNzIHN0cmlraW5nIGFtb25nIGNoaWxkcmVuIHRoYW4gaXQgd2FzIGFtb25nIGFkdWx0czogV2hpbGUgbWFueSBjaGlsZHJlbiBhdHRyaWJ1dGVkIG1vcmUgTUlORCB0aGFuIEhFQVJUIHRvIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGluIHF1ZXN0aW9uIChsaWtlIHRoZSB2YXN0IG1ham9yaXR5IG9mIGFkdWx0cyksIHF1aXRlIGEgZmV3IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBIRUFSVCB0aGFuIE1JTkQgKHNlZSBGaWd1cmUgNC42LCBwYW5lbCBCMykuIAoKVGhpcyBhc3ltbWV0cnkgYXBwZWFyZWQgdG8gYmUgcHJlc2VudCBhY3Jvc3MgdGhlIHJhbmdlIG9mIHRhcmdldCBjaGFyYWN0ZXJzIGluY2x1ZGVkIGluIHRoaXMgc3R1ZHksIHRob3VnaCBpdCB3YXMgbW9yZSBwcm9ub3VuY2VkIGZvciBzb21lIGNoYXJhY3RlcnMgKGUuZy4sIHRoZSB0ZWNobm9sb2dpZXM7IHNlZSBGaWd1cmUgNC43LCBwYW5lbCBCMywgYW5kIHRoZSB2YXJpb3VzIGNvbXBhcmlzb25zIG9mIHRhcmdldCBjaGFyYWN0ZXJzIHRvIHRoZSBncmFuZCBtZWFuIGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjYuKQoKVmlzdWFsIGluc3BlY3Rpb24gb2YgbWVhbiBzY29yZXMgYnkgdGFyZ2V0IGNoYXJhY3RlciByZXZlYWxzIG5vIGV2aWRlbmNlIG9mIHRoZSBraW5kIG9mICJ0aHJlc2hvbGQiIG1vZGVsIGRpc2N1c3NlZCBmb3IgYWR1bHRzLiAKCiMjIyMgSW50ZXJpbSBkaXNjdXNzaW9uCgpBcyBpbiBTdHVkeSAyLCB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyBCT0RZLCBIRUFSVCwgYW5kIE1JTkQgYW1vbmcgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiB3ZXJlIGJyb2FkbHkgc2ltaWxhciB0byB0aG9zZSBvZiBhZHVsdHMsIGJ1dCBhdHRlbnVhdGVkIGluIHN0cmVuZ3RoLiBUaGVzZSBjaGlsZHJlbiB0ZW5kZWQgdG8gZW5kb3JzZSBib3RoIEJPRFkgYW5kIE1JTkQgYXQgbGVhc3Qgc29tZXdoYXQgbW9yZSBzdHJvbmdseSB0aGFuIEhFQVJULCBidXQgdGhlcmUgd2FzIG5vIHN5c3RlbWF0aWMgYXN5bW1ldHJ5IGJldHdlZW4gTUlORCBhbmQgQk9EWS4gSW5zdGVhZCwgY2hpbGRyZW4ncyByZWxhdGl2ZSBlbmRvcnNlbWVudHMgb2YgQk9EWSBhbmQgTUlORCB3ZXJlIGhpZ2hseSBjb250aW5nZW50IG9uIHRoZSB0eXBlIG9mIHRhcmdldCBjaGFyYWN0ZXIgdW5kZXIgY29uc2lkZXJhdGlvbi4KCkluIFN0dWR5IDMsIHRoZSBhc3ltbWV0cnkgaW4gNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbidzIF9CT0RZXyB2cy4gX0hFQVJUXyBzY29yZXMgd2FzIHN0cm9uZyBlbm91Z2ggdG8gYmUgZGlmZmVyZW50aWFibGUgZnJvbSB6ZXJvIChpbiBjb250cmFzdCB0byB0aGlzIGFnZSBncm91cCBpbiBTdHVkeSAyKS4gSW50ZXJlc3RpbmdseSwgaG93ZXZlciwgY2hpbGRyZW4gaW4gdGhpcyBzdHVkeSBkaXZlcmdlZCBmcm9tIHRoaXMgZ2VuZXJhbCByZXNwb25zZSBwYXR0ZXJuIGluIHRoZWlyIGFzc2Vzc21lbnRzIG9mIHRoZSByb2JvdCwgZW5kb3JzaW5nIF9IRUFSVF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9CT0RZXyBpdGVtcyBmb3IgdGhpcyB1bnVzdWFsICJzb2NpYWwiIHBhcnRuZXIuIFRvZ2V0aGVyIHdpdGggdGhlIHJlc3VsdHMgb2YgU3R1ZHkgMiwgdGhpcyBzdWdnZXN0cyB0aGF0IDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gaGF2ZSBhbiBhZHVsdC1saWtlIGludHVpdGlvbiB0aGF0IGJlaW5ncyBtaWdodCBoYXZlIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucyAoQk9EWSkgd2l0aG91dCBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyAoSEVBUlQpIGJ1dCBub3Qgc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMgd2l0aG91dCBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnPigJRidXQgbWF5IG1ha2UgYW4gZXhjZXB0aW9uIHRvIHRoaXMgZ2VuZXJhbCBydWxlIGZvciBjZXJ0YWluIGV4Y2VwdGlvbmFsIGVudGl0aWVzLiAKCiMjIyBDaGlsZHJlbiAoNC02eSkKCkluIGFkZGl0aW9uIHRvIGJ1aWxkaW5nIG9uIHRoZSByZXN1bHRzIG9mIFN0dWRpZXMgMSBhbmQgMiBpbiByZS1hc3Nlc3NpbmcgY29uY2VwdHVhbCByZXByZXNlbnRhdGlvbnMgYW1vbmcgYWR1bHRzIGFuZCA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuLCBTdHVkeSAzIGFsc28gcHJvdmlkZWQgYW4gaW5pdGlhbCBmb3JheSBpbnRvIHRoaXMgYXNwZWN0IG9mIGNvbmNlcHR1YWwgcmVwcmVzZW50YXRpb25zIGFtb25nIHlvdW5nZXIgY2hpbGRyZW4gKDQtNnkgb2YgYWdlKS4gSW4gQ2hhcHRlciBJSUksIEVGQSBzdWdnZXN0ZWQgdGhhdCA0LSB0byA2LXllYXItb2xkIGNoaWxkcmVuIGhhdmUgb25seSBhIG5hc2NlbnQgdW5kZXJzdGFuZGluZyBvZiB0aGUgc3VpdGVzIG9mIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucywgc29jaWFsLWVtb3Rpb25hbCBhYmlsaXRpZXMsIGFuZCBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBjYXBhY2l0aWVzIHRoYXQgSSBoYXZlIGFyZ3VlZCBmb3JtIHRoZSAiY29uY2VwdHVhbCB1bml0cyIgb2YgYWR1bHRzJyByZXByZXNlbnRhdGlvbnMuIE5vbmV0aGVsZXNzLCBjaGlsZHJlbiBpbiB0aGlzIGFnZSByYW5nZSBtYXkgc2hhcmUgb3RoZXIgYXNwZWN0cyBvZiBhZHVsdHMnIHJlcHJlc2VudGF0aW9ucyBvZiB0aGlzIGNvbmNlcHR1YWwgc3BhY2UuIEhvdyBkbyB5b3VuZ2VyIGNoaWxkcmVuJ3MgcmVwcmVzZW50YXRpb25zIG9mIHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIEJPRFksIEhFQVJULCBhbmQgTUlORCBjb21wYXJlIHRvIHRob3NlIG9mIG9sZGVyIGNoaWxkcmVuIGFuZCBhZHVsdHM/IAoKYGBge3J9CmQzXzQ2X3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDNfNDYsIHNjYWxlc19lZmFfd2RtX2QzX2FkKQpzYXZlUkRTKGQzXzQ2X3Njb3JlZF9hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY29yZWRfZGF0YS9kM180Nl9zY29yZWRfYWQiKQpgYGAKCiMjIyMgVmlzdWFsaXphdGlvbiBhbmQgYW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKCmBgYHtyfQpwbG90c19kM180Nl9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkM180Nl9zY29yZWRfYWQsIGNvbG9ycyA9IGNvbG9yczA5KQpgYGAKCmBgYHtyfQpmaWdfZDNfNDZfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QzXzQ2X3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QzXzQ2X3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QzXzQ2X3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkMxIiwgIkMyIiwgIkMzIiksIG5jb2wgPSAzKQoKZmlnX2QzXzQ2X2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QzXzQ2X3Njb3JlZF9hZFtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIAogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDksCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSA5KSkpCgpmaWdfZDNfNDZfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWdfZDNfNDZfcGxvdHMsIGZpZ19kM180Nl9sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDNfNDZfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAzOiBDaGlsZHJlbiwgNC02eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kM180Nl9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKGZpZ19kM180Nl90aXRsZSwgZmlnX2QzXzQ2X3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpmaWdfZDNfNDZfcGxvdHNfbGVnX3RpdGxlCmBgYAoKYGBge3J9CmQzXzQ2X3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfZnVuKGQzXzQ2X3Njb3JlZF9hZCkKY29udHJhc3RzKGQzXzQ2X3Njb3JlZF9hZF9kaWZmJGNoYXJhY3RlcikgPC0gY29udHJhc3RzX3N1bV9kdjA5CgpzYXZlUkRTKGQzXzQ2X3Njb3JlZF9hZF9kaWZmLCAiLi9zdG9yZWQvZGlmZnNjb3JlX2RhdGEvZDNfNDZfc2NvcmVkX2FkX2RpZmYiKQpgYGAKCmBgYHtyfQpwbG90X2QzXzQ2X3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZwbG90X2Z1bihkM180Nl9zY29yZWRfYWRfZGlmZiwgY29sb3JzID0gY29sb3JzMDkpCmBgYAoKYGBge3J9CiMgcl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQzXzQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDNfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKcl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKc3VtbWFyeShyX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDNfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKcl9kM180Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCkKYGBgCgpgYGB7cn0KcmVndGFiX2QzXzQ2X3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKICAgICAgICAgICAgICAgICAgcl9kM180Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJDaGlsZHJlbiwgNC02eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpIiwKICBjaGFyX2xhYmVsID0gYygiRWxlcGhhbnQgdnMuIEdNIiwgIkdvYXQgdnMuIEdNIiwgIk1vdXNlIHZzLiBHTSIsCiAgICAgICAgICAgICAgICAgIkJpcmQgdnMuIEdNIiwgIkJlZXRsZSB2cy4gR00iLCAiVGVkZHkgYmVhciB2cy4gR00iLAogICAgICAgICAgICAgICAgICJEb2xsIHZzLiBHTSIsICJSb2JvdCB2cy4gR00iKSkKYGBgCgpgYGB7cn0KIyBpbnRlcmltIHRhYmxlIGZvciBlYXNlIG9mIHdyaXRpbmcKcmVndGFiX2QzXzQ2X3Njb3JlZF9hZF9kaWZmICU+JQogIHNlbGVjdCgtc3R1ZHksIC1zLmUuKSAlPiUKICBmaWx0ZXIocGFyYW0gPT0gIkludGVyY2VwdCIpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCnBsb3RfZDNfNDZfc2NvcmVkX2FkX2RpZmYKYGBgCgpWaXN1YWxpemF0aW9ucyBvZiByZWxhdGlvbnNoaXBzIGFtb25nIDQtIHRvIDYteWVhci1vbGQgY2hpbGRyZW4ncyBzY29yZXMgb24gdGhlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYXJlIHByb3ZpZGVkIGluIEZpZ3VyZSA0LjYsIHJvdyBDLiBIZXJlIEkgY29tYmluZSBteSBpbmZvcm1hbCBkZXNjcmlwdGlvbnMgb2YgdGhlc2UgdmlzdWFsaXphdGlvbnMgd2l0aCBmb3JtYWwgYW5hbHlzZXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBjb25jZXB0dWFsIHVuaXRzLCBjb250cm9sbGluZyBmb3IgZGlmZmVyZW5jZXMgaW4gYXNzZXNzbWVudHMgb2YgdGhlIG5pbmUgImRpdmVyc2UgY2hhcmFjdGVycyIgdGhhdCB3ZXJlIGZlYXR1cmVkIGFzIHRhcmdldCBjaGFyYWN0ZXJzIGluIHRoZXNlIHN0dWRpZXMuIFNlZSBGaWd1cmUgNC43LCBwYW5lbCBDLCBmb3IgdmlzdWFsIGRlcGljdGlvbnMgb2YgdGhlc2UgZGlmZmVyZW5jZSBzY29yZXMsIGFuZCBUYWJsZSA0LjYgZm9yIHRoZSBmdWxsIHJlc3VsdHMgb2YgdGhlc2UgQmF5ZXNpYW4gcmVncmVzc2lvbiBhbmFseXNlcy4KClByaW9yIHRvIGNvbW1lbnRpbmcgb24gZWFjaCBvZiB0aGVzZSBjb21wYXJpc29ucyBpbmRpdmlkdWFsbHksIG9uZSBzdHJpa2luZyBmZWF0dXJlIG9mIHRoZSB2aXN1YWxpemF0aW9ucyBvZiB5b3VuZ2VyIGNoaWxkcmVuJ3MgcmVzcG9uc2VzIGlzIHRoYXQgdGhleSBhbGwgbG9vayBxdWl0ZSBzaW1pbGFyLiBFYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyBpcyBjaGFyYWN0ZXJpemVkIGJ5IHR3byBzdWl0ZXMgb2YgY2hhcmFjdGVyczogKDEpIGdyb3VwIG9mIGluYW5pbWF0ZSBvYmplY3RzIHdoaWNoLCBpbiB0aGUgYWdncmVnYXRlLCByZWNlaXZlZCBtb2RlcmF0ZWx5IGxvdyBzY29yZXMgb24gYWxsIHNjYWxlczsgYW5kICgyKSBhIGdyb3VwIG9mIGFuaW1hdGUgYmVpbmdzIHdoaWNoLCBpbiB0aGUgYWdncmVnYXRlLCByZWNlaXZlZCBtb2RlcmF0ZWx5IGhpZ2ggc2NvcmVzIG9uIGFsbCBzY2FsZXMuIFRoaXMgd2FzIG1vcmUgcHJvbm91bmNlZCBhbW9uZyB5b3VuZ2VyIGNoaWxkcmVuIHRoYW4gaW4gZWl0aGVyIG9mIHRoZSBvdGhlciBhZ2UgZ3JvdXBzLgoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkFzIGFtb25nIGFkdWx0cyBhbmQgb2xkZXIgY2hpbGRyZW4sIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiA0LSB0byA2LXllYXItb2xkcyBfQk9EWV8gYW5kIF9IRUFSVF8gc2NvcmVzIHdhcyBwb3NpdGl2ZSAoYHIgc2NvcmVfY29yX3ByaW50X2Z1bihkM180Nl9zY29yZWRfYWQsICJCT0RZIHZzLiBIRUFSVCIpYCksIGFuZCB0aGVpciBkaWZmZXJlbmNlIHNjb3JlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfQk9EWV8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC42KS4gQWdhaW4sIHRoaXMgYXN5bW1ldHJ5IGFwcGVhcnMgdG8gaGF2ZSBiZWVuIGRyaXZlbiBieSByZXNwb25zZXMgdG8gdGhlIGFuaW1hdGUgYmVpbmdzIChzZWUgRmlndXJlIDQuNywgcGFuZWwgQywgYW5kIHRoZSB2YXJpb3VzIGNvbXBhcmlzb25zIG9mIHRhcmdldCBjaGFyYWN0ZXJzIHRvIHRoZSBncmFuZCBtZWFuIGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC42KS4gSG93ZXZlciwgdGhlIHZpc3VhbGl6YXRpb24gb2YgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbidzIHJlc3BvbnNlcyBtYWtlcyBpdCBjbGVhciB0aGF0IHRoZSBhc3ltbWV0cnkgYmV0d2VlbiBCT0RZIHZzLiBIRUFSVCB3YXMgcXVpdGUgd2Vhaywgd2l0aCBvbmx5IHNsaWdodGx5IG1vcmUgZGF0YXBvaW50cyBiZWxvdyB0aGFuIGFib3ZlIHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSAtIHgkLCBGaWd1cmUgNC43LCBwYW5lbCBDMSkuCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpBcyBhbW9uZyBhZHVsdHMgYW5kIG9sZGVyIGNoaWxkcmVuLCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gNC0gdG8gNi15ZWFyLW9sZHMgX0JPRFlfIGFuZCBfTUlORF8gc2NvcmVzIHdhcyBwb3NpdGl2ZSAoYHIgc2NvcmVfY29yX3ByaW50X2Z1bihkM180Nl9zY29yZWRfYWQsICJCT0RZIHZzLiBNSU5EIilgKS4gWW91bmdlciBjaGlsZHJlbidzIF9CT0RZXyB2cy4gX01JTkRfIGRpZmZlcmVuY2Ugc2NvcmVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVyb+KAlGJ1dCB0aGlzIGFzeW1tZXRyeSByYW4gaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiBvZiBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzLCB3aXRoIGNoaWxkcmVuIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgX2xlc3NfIHN0cm9uZ2x5IHRoYW4gX0JPRFlfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJCT0RZLU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC42KS4gVGhpcyBhc3ltbWV0cnkgYXBwZWFycyB0byBoYXZlIGJlZW4gZHJpdmVuIGJ5IHJlc3BvbnNlcyB0byBhbmltYXRlIGJlaW5ncy4gKFNlZSBGaWd1cmUgNC43LCBwYW5lbCBDLCBhbmQgdGhlIHZhcmlvdXMgY29tcGFyaXNvbnMgb2YgdGFyZ2V0IGNoYXJhY3RlcnMgdG8gdGhlIGdyYW5kIG1lYW4gZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjYuKSBBZ2FpbiwgaG93ZXZlciwgdGhlIHZpc3VhbGl6YXRpb24gb2YgNC0gdG8gNi15ZWFyLW9sZCBjaGlsZHJlbidzIHJlc3BvbnNlcyBtYWtlcyBpdCBjbGVhciB0aGF0IHRoZSBhc3ltbWV0cnkgYmV0d2VlbiBCT0RZIHZzLiBNSU5EIHdhcyBxdWl0ZSB3ZWFrLCB3aXRoIG9ubHkgc2xpZ2h0bHkgbW9yZSBkYXRhcG9pbnRzIGJlbG93IHRoYW4gYWJvdmUgdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5IC0geCQsIEZpZ3VyZSA0LjcsIHBhbmVsIEMyKS4KCiMjIyMjIEhFQVJUIHZzLiBNSU5ECgpBcyBhbW9uZyBhZHVsdHMgYW5kIG9sZGVyIGNoaWxkcmVuLCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gNC0gdG8gNi15ZWFyLW9sZHMgX0hFQVJUXyBhbmQgX01JTkRfIHNjb3JlcyB3YXMgcG9zaXRpdmUgKGByIHNjb3JlX2Nvcl9wcmludF9mdW4oZDNfNDZfc2NvcmVkX2FkLCAiSEVBUlQgdnMuIE1JTkQiKWApLiBIb3dldmVyLCBpbiBjb250cmFzdCB0byBhZHVsdHMgYW5kIG9sZGVyIGNoaWxkcmVuLCB5b3VuZ2VyIGNoaWxkcmVuJ3MgX0hFQVJUXyB2cy4gX01JTkRfIGRpZmZlcmVuY2Ugc2NvcmVzIGRpZCBub3QgZGlmZmVyIHN1YnN0YW50aWFsbHkgZnJvbSB6ZXJvLCBhbmQgdmFyaWVkIG9ubHkgc3VidGx5IGFjcm9zcyB0YXJnZXQgY2hhcmFjdGVycy4gKFNlZSBGaWd1cmUgNC43LCBwYW5lbCBDLCBhbmQgdGhlIHZhcmlvdXMgY29tcGFyaXNvbnMgb2YgdGFyZ2V0IGNoYXJhY3RlcnMgdG8gdGhlIGdyYW5kIG1lYW4gZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjYuKQoKIyMjIyBJbnRlcmltIGRpc2N1c3Npb24gYW5kIGdlbmVyYWwgb2JzZXJ2YXRpb25zIGFib3V0IGRldmVsb3BtZW50CgpCb3RoIGluZm9ybWFsIG9ic2VydmF0aW9ucyBhbmQgZm9ybWFsIGFuYWx5c2VzIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIHN1Z2dlc3RlZCB0aGF0LCBsaWtlIGFkdWx0cyBpbiBhbGwgc3R1ZGllcyBhbmQgbGlrZSBvbGRlciBjaGlsZHJlbiBpbiB0aGlzIHN0dWR5LCA0LSB0byA2LXllYXItb2xkIGNoaWxkcmVuIHRlbmRlZCB0byBlbmRvcnNlIEJPRFkgbW9yZSBzdHJvbmdseSB0aGFuIEhFQVJULiBIb3dldmVyLCB0aGVzZSB5b3VuZ2VyIGNoaWxkcmVuIGRpdmVyZ2VkIGZyb20gdGhlaXIgb2xkZXIgY291bnRlcnBhcnRzIGJ5IHN5c3RlbWF0aWNhbGx5IGVuZG9yc2luZyBCT0RZIG1vcmUgc3Ryb25nbHkgdGhhbiBNSU5ELCBhbmQgYnkgZmFpbGluZyB0byBzaG93IGFueSBzeXN0ZW1hdGljIGFzeW1tZXRyeSBiZXR3ZWVuIEhFQVJUIGFuZCBNSU5ELgoKIyMjIERldmVsb3BtZW50YWwgY29tcGFyaXNvbgoKR2VuZXJhbCBkZXZlbG9wbWVudGFsIHRyZW5kcyBhY3Jvc3MgdGhlc2UgdGhyZWUgYWdlIGdyb3VwcyBhcmUgcGVyaGFwcyBlYXNpZXN0IHRvIG9ic2VydmUgaW4gRmlndXJlIDQuNiwgcm93IEQsIHdoaWNoIHByZXNlbnRzIChoeXBvdGhldGljYWwpICJtb3ZlbWVudCIgYmV0d2VlbiB0aGUgbWVhbiBwbGFjZW1lbnQgZm9yIGEgdGFyZ2V0IGNoYXJhY3RlciBhbW9uZyB5b3VuZ2VyIGNoaWxkcmVuIChiZWdpbm5pbmcgb2YgYXJyb3cpLCBhbW9uZyBvbGRlciBjaGlsZHJlbiAobWlkZGxlICJqb2ludCIgb2YgYXJyb3cpLCBhbmQgYW1vbmcgYWR1bHRzIChhcnJvd2hlYWQpLCBmb3IgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMuIEluIGVhY2ggY2FzZSwgdGhpcyAibW92ZW1lbnQiIGVpdGhlciBtYWludGFpbnMgYSBzaW1pbGFyIGRpc3RhbmNlIGZyb20gdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5ID0geCQpIChhcyB3aXRoIG1lYW4gYXNzZXNzbWVudHMgb2YgdGhlIGluZXJ0IG9iamVjdHMgYW5kIHRlY2hub2xvZ2llcyBpbiB0aGUgQk9EWSB2cy4gSEVBUlQgc3BhY2UsIHBhbmVsIEQxOyBhbmQgdGhlIGluZXJ0IG9iamVjdHMgYW5kIGFuaW1hdGUgYmVpbmdzIGluIHRoZSBCT0RZIHZzLiBNSU5EIHNwYWNlLCBwYW5lbCBEMjsgYW5kIHRoZSBpbmVydCBvYmplY3RzIGluIHRoZSBIRUFSVCB2cy4gTUlORCBzcGFjZSwgcGFuZWwgRDMpIG9yIG1vdmVzIGF3YXkgZnJvbSB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSB0b3dhcmQgdGhlIHVwcGVyIGxlZnQgYW5kIGxvd2VyIHJpZ2h0IGNvcm5lcnMgb2YgdGhlIHBsb3QgKGFzIHdpdGggbWVhbiBhc3Nlc3NtZW50cyBvZiB0aGUgYW5pbWF0ZSBiZWluZ3MgaW4gdGhlIEJPRFkgdnMuIEhFQVJUIHNwYWNlLCBwYW5lbCBEMTsgdGhlIHRlY2hub2xvZ2llcyBpbiB0aGUgQk9EWSB2cy4gTUlORCBzcGFjZSwgcGFuZWwgRDI7IGFuZCB0aGUgdGVjaG5vbG9naWVzIGFuZCBhbmltYXRlIGJlaW5ncyBpbiB0aGUgSEVBUlQgdnMuIE1JTkQgc3BhY2UsIHBhbmVsIEQzKS4gQW5hbHlzaXMgb2YgY2hhbmdlcyBpbiBfYWJzb2x1dGVfIGF0dHJpYnV0aW9ucyBvZiBCT0RZLCBIRUFSVCwgYW5kIE1JTkQsIGlzIHB1cnN1ZWQgaW4gQ2hhcHRlciBWOyBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSBjdXJyZW50IGNoYXB0ZXIsIHRoZSBwcmltYXJ5IG9ic2VydmF0aW9uIG9mIGludGVyZXN0IGlzIHRoYXQgdGhlc2UgInNoaWZ0cyIgYmV0d2VlbiBjaGlsZCBhbmQgYWR1bHQgYXNzZXNzbWVudHMgb2YgdGhlc2UgY2hhcmFjdGVycyBnZW5lcmFsbHkgcG9pbnQgaW4gdGhlIGRpcmVjdGlvbiBvZiBzdGFibGUgb3IgaW5jcmVhc2luZyAobm90IGRlY3JlYXNpbmcpIGFzeW1tZXRyaWVzIG92ZXIgZGV2ZWxvcG1lbnRhbCB0aW1lLiBUaGlzIGFsaWducyBxdWl0ZSB3ZWxsIHdpdGggbXkgb2JzZXJ2YXRpb25zIG9mICJtb3ZlbWVudCIgYmV0d2VlbiA3LTl5IGFuZCBhZHVsdGhvb2QgaW4gU3R1ZHkgMi4KClRvIGFzc2VzcyB0aGUgc2l6ZSBhbmQgcm9idXN0bmVzcyBvZiB0aGVzZSBhcHBhcmVudCBkZXZlbG9wbWVudGFsIGRpZmZlcmVuY2VzLCBJIGNvbmR1Y3RlZCBmb3JtYWwgY29tcGFyaXNvbnMgb2YgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBjb25jZXB0dWFsIHVuaXRzIGFtb25nIHRoZXNlIHR3byBhZ2UgZ3JvdXBzLiBGb3IgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMsIEkgcG9vbGVkIGRhdGEgZnJvbSB0aGUgdGhyZWUgYWdlIGdyb3VwcyBhbmQgbW9kaWZpZWQgbXkgcmVncmVzc2lvbiBhbmFseXNlcyB0byBpbmNsdWRlIGEgbWFpbiBlZmZlY3Qgb2YgYWdlIGdyb3VwIChjb21wYXJpbmcgYm90aCBvbGRlciBhbmQgeW91bmdlciBjaGlsZHJlbidzIGRpZmZlcmVuY2Ugc2NvcmVzIHRvIHRoZSBiYXNlbGluZSBzZXQgYnkgYWR1bHRzKSBhbmQgYW4gaW50ZXJhY3Rpb24gYmV0d2VlbiBhZ2UgZ3JvdXAgYW5kIHRhcmdldCBjaGFyYWN0ZXIgKGFzc2Vzc2luZyB3aGV0aGVyIHRoZSBvYnNlcnZlZCBkaWZmZXJlbmNlcyBiZXR3ZWVuIGNoYXJhY3RlcnMgdmFyaWVkIGJ5IGFnZSBncm91cCkuCgpgYGB7cn0KZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmIDwtIGQzX2FkX3Njb3JlZF9hZF9kaWZmICU+JQogIGZ1bGxfam9pbihkM183OV9zY29yZWRfYWRfZGlmZikgJT4lCiAgZnVsbF9qb2luKGQzXzQ2X3Njb3JlZF9hZF9kaWZmKSAlPiUKICBtdXRhdGUoYWdlX2dyb3VwID0gZmFjdG9yKGFnZV9ncm91cCkpCmNvbnRyYXN0cyhkM19hZDc5NDZfc2NvcmVkX2FkX2RpZmYkY2hhcmFjdGVyKSA8LSBjb250cmFzdHNfc3VtX2R2MDkKY29udHJhc3RzKGQzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZiRhZ2VfZ3JvdXApIDwtIGNvbnRyYXN0c19kdW0zX2FnZWdwCmBgYAoKYGBge3J9CiMgcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciAqIGFnZV9ncm91cCwKIyAgIGRhdGEgPSBkM19hZDc5NDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpyX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciAqIGFnZV9ncm91cCwKIyAgIGRhdGEgPSBkM19hZDc5NDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpyX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnN1bW1hcnkocl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKiBhZ2VfZ3JvdXAsCiMgICBkYXRhID0gZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnN1bW1hcnkocl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCkKYGBgCgpgYGB7cn0KcmVndGFiX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX3JlZ190YWJsZV9mdW4oCiAgcmVnX2xpc3QgPSBsaXN0KHJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiAgICAgICAgICAgICAgICAgIHJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKICAgICAgICAgICAgICAgICAgcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCksCiAgcGFpcl9saXN0ID0gYygiQk9EWSAtIEhFQVJUIiwgIkJPRFkgLSBNSU5EIiwgIkhFQVJUIC0gTUlORCIpLAogIHN0dWR5X25hbWUgPSAiRGV2ZWxvcG1lbnRhbCBjb21wYXJpc29uIiwKICBjaGFyX2xhYmVsID0gYygiRWxlcGhhbnQgdnMuIEdNIiwgIkdvYXQgdnMuIEdNIiwgIk1vdXNlIHZzLiBHTSIsCiAgICAgICAgICAgICAgICAgIkJpcmQgdnMuIEdNIiwgIkJlZXRsZSB2cy4gR00iLCAiVGVkZHkgYmVhciB2cy4gR00iLAogICAgICAgICAgICAgICAgICJEb2xsIHZzLiBHTSIsICJSb2JvdCB2cy4gR00iKSwgCiAgYWdlZ3BfbGFiZWwgPSBjKCJPbGRlciBjaGlsZHJlbiB2cy4gYWR1bHRzIiwgCiAgICAgICAgICAgICAgICAgICJZb3VuZ2VyIGNoaWxkcmVuIHZzLiBhZHVsdHMiKSkKYGBgCgpgYGB7cn0KIyBpbnRlcmltIHRhYmxlIGZvciBlYXNlIG9mIHdyaXRpbmcKcmVndGFiX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgZmlsdGVyKHBhcmFtID09ICJJbnRlcmNlcHQiIHwgZ3JlcGwoImNoaWxkcmVuIiwgdG9sb3dlcihwYXJhbSkpKSAlPiUKICBmaWx0ZXIoIWdyZXBsKCJcXCoiLCBwYXJhbSkpICU+JSAjIHJlbW92ZSBpbnRlcmFjYXRpb25zCiAga2FibGUoZGlnaXRzID0gMikgJT4lCiAga2FibGVfc3R5bGluZygpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKcGxvdF9ncmlkKHBsb3RfZDNfYWRfc2NvcmVkX2FkX2RpZmYsIAogICAgICAgICAgcGxvdF9kM183OV9zY29yZWRfYWRfZGlmZiwgCiAgICAgICAgICBwbG90X2QzXzQ2X3Njb3JlZF9hZF9kaWZmLCAKICAgICAgICAgIG5jb2wgPSAzKQpgYGAKClRoZXNlIGFuYWx5c2VzIGNvbmZpcm1lZCB0aGF0IF9CT0RZXyB2cy4gX0hFQVJUXyBkaWZmZXJlbmNlIHNjb3JlcyBhbmQgX0hFQVJUXyB2cy4gX01JTkRfIGRpZmZlcmVuY2Ugc2NvcmVzIHdlcmUgc3Vic3RhbnRpYWxseSBjbG9zZXIgdG8gemVybyBhbW9uZyBib3RoIG9sZGVyIGFuZCB5b3VuZ2VyIGNoaWxkcmVuLCBhcyBjb21wYXJlZCB0byBhZHVsdHMgKHNlZSB0aGUgIk9sZGVyIHZzLiBhZHVsdHMiIGFuZCAiWW91bmdlciBjaGlsZHJlbiB2cy4gYWR1bHRzIiByb3dzIGZvciB0aGUgIkJPRFktSEVBUlQiIGFuZCAiSEVBUlQtTUlORCIgY29tcGFyaXNvbnMgaW4gVGFibGUgNC43KS4KCk1lYW53aGlsZSwgX0JPRFlfIHZzLiBfTUlORF8gZGlmZmVyZW5jZSBzY29yZXMgd2VyZSBub3QgZGlmZmVyZW50aWFibGUgZnJvbSBhZHVsdHMgYW1vbmcgb2xkZXIgY2hpbGRyZW4gaW4gdGhpcyBhbmFseXNpc+KAlGxpa2VseSBiZWNhdXNlIHRoaXMgd2FzIHRoZSB3ZWFrZXN0IG9mIHRoZSBhc3ltbWV0cmllcyBhbW9uZyBhZHVsdHMuIEluIGNvbnRyYXN0LCB0aGUgYXN5bW1ldHJ5IGJldHdlZW4gX0JPRFlfIGFuZCBfTUlORF8gc2NvcmVzIHdhcyBzbyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudCBhbW9uZyB5b3VuZ2VyIGNoaWxkcmVuLCBjb21wYXJlZCB0byBhZHVsdHMsIHRoYXQgaXQgcmV2ZXJzZWQgaW4gc2lnbiAoc2VlIHRoZSAiT2xkZXIgdnMuIGFkdWx0cyIgYW5kICJZb3VuZ2VyIGNoaWxkcmVuIHZzLiBhZHVsdHMiIHJvd3MgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuNykuCgpGb3IgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMsIGEgaGFuZGZ1bCBvZiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyBkaWZmZXJlZCBzdWJzdGFudGlhbGx5IGFjcm9zcyBhZ2UgZ3JvdXBzIChzZWUgVGFibGUgNC43KTsgdGhpcyBpcyBvdXRzaWRlIG9mIHRoZSBzY29wZSBvZiB0aGUgY3VycmVudCBjaGFwdGVyLiAgCgojIyBEaXNjdXNzaW9uCgpTdHVkeSAzIHByb3ZpZGVzIHlldCBtb3JlIGNvbmZpcm1hdGlvbiBvZiB0aGUgcm9idXN0bmVzcyBvZiB0aGUgYXN5bW1ldHJpYyByZWxhdGlvbnNoaXBzIGFtb25nIGNvbmNlcHR1YWwgdW5pdHMgaW4gYWR1bHRzJyByZXByZXNlbnRhdGlvbnMgb2YgbWVudGFsIGxpZmUgYXMgcmV2ZWFsZWQgYnkgU3R1ZGllcyAxIGFuZCAyICh1c2luZyB5ZXQgYW5vdGhlciBleHBlcmltZW50YWwgcGFyYWRpZ20sIGEgc21hbGxlciBzZXQgb2YgbWVudGFsIGNhcGFjaXRpZXMsIGFuZCBhIGRpZmZlcmVudCBzZXQgb2YgZGl2ZXJzZSB0YXJnZXQgY2hhcmFjdGVycyk6IFlldCBhZ2FpbiwgYWR1bHRzIHN5c3RlbWF0aWNhbGx5IGVuZG9yc2VkIGJvdGggQk9EWSBhbmQgTUlORCBhdCBsZWFzdCBhcyBzdHJvbmdseSwgYW5kIG9mdGVuIG1vcmUgc3Ryb25nbHksIHRoYW4gSEVBUlQgcmVnYXJkbGVzcyBvZiB3aGljaCB0YXJnZXQgY2hhcmFjdGVyIHRoZXkgYXNzZXNzZWQsIHdoaWxlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBCT0RZIGFuZCBNSU5EIHdhcyBtb3JlIGNvbnRpbmdlbnQgb24gdGhlIHRhcmdldCBjaGFyYWN0ZXIgdW5kZXIgZXZhbHVhdGlvbi4KClRoaXMgc3R1ZHkgYWxzbyBzdXBwb3J0cyBhbmQgZXh0ZW5kcyB0aGUgZGV2ZWxvcG1lbnRhbCBzdG9yeSB0aGF0IGJlZ2FuIGluIFN0dWR5IDIuIFN0dWR5IDMgcHJvdmlkZXMgZXZlbiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIFN0dWR5IDIgdGhhdCwgYnkgbWlkZGxlIGNoaWxkaG9vZCAoNy05eSBvZiBhZ2UpLCBjaGlsZHJlbiBob2xkIHdlYWsgYnV0IG90aGVyd2lzZSBhZHVsdC1saWtlIGludHVpdGlvbnMgYWJvdXQgdGhlIGFzeW1tZXRyaWNhbCByZWxhdGlvbnNoaXBzIGFtb25nIEJPRFksIEhFQVJULCBhbmQgTUlORDogQW1vbmcgdGhpcyBzYW1wbGUgb2YgNy0gdG8gOS15ZWFyLW9sZCBjaGlsZHJlbiwgdGhlc2UgcmVsYXRpb25zaGlwcyBhbGwgYXBwZWFyZWQgc2ltaWxhciBpbiBkaXJlY3Rpb24gdG8gdGhvc2UgZG9jdW1lbnRlZCBhbW9uZyBhZHVsdHMsIGFsdGhvdWdoIHRoZXkgd2VyZSBnZW5lcmFsbHkgYXR0ZW51YXRlZCBpbiBzdHJlbmd0aC4gSW4gcGFydGljdWxhciwgdGhlIHVzZSBvZiBhIGRpdmVyc2UgcmFuZ2Ugb2YgdGFyZ2V0IGNoYXJhY3RlcnMgaW4gU3R1ZHkgMyBzaGVkIGxpZ2h0IG9uIHRoZSBmYWlsdXJlIG9mIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW4gaW4gU3R1ZHkgMiB0byBkZW1vbnN0cmF0ZSBhbiBhZHVsdC1saWtlIHBhdHRlcm4gb2YgZW5kb3JzaW5nIEJPRFkgbW9yZSBzdHJvbmdseSB0aGFuIEhFQVJUIHRvIHRoZSAiZWRnZSBjYXNlcyIgZmVhdHVyZWQgaW4gdGhhdCBzdHVkeSAodGhlIGJlZXRsZSBhbmQgdGhlIHJvYm90KTogSW4gU3R1ZHkgMyBvbGRlciBjaGlsZHJlbidzIHJlc3BvbnNlcyBzdWdnZXN0ZWQgdGhhdCBjaGlsZHJlbiBpbiB0aGlzIGFnZSByYW5nZSBfZG9fIGluIGZhY3QgYXBwZWFyIHRvIHNoYXJlIHRoaXMgdGVuZGVuY3kgd2l0aCBhZHVsdHMgd2hlbiBjb25mcm9udGVkIHdpdGggbW9zdCB0YXJnZXQgY2hhcmFjdGVycywgYnV0IG1heSB0cmVhdCByb2JvdHMgYXMgYSBhIHBhcnRpY3VsYXIgZXhjZXB0aW9uIHRvIHRoaXMgZ2VuZXJhbCBydWxlLgoKSW4gZmFjdCwgdGhpcyBwYXJ0aWN1bGFyIGxlZyBvZiB0aGUgYWR1bHQgcGF0dGVybiBvZiBhc3ltbWV0cmljYWwgcmVsYXRpb25zaGlwcyBhbW9uZyBCT0RZLCBIRUFSVCwgYW5kIE1JTkTigJRhIHRlbmRlbmN5IHRvIGVuZG9yc2UgQk9EWSBtb3JlIHN0cm9uZ2x5IHRoYW4gSEVBUlTigJRhcHBlYXJlZCB0byBiZSBlbWVyZ2VudCBldmVuIGFtb25nIHRoZSBzYW1wbGUgb2YgeW91bmdlciBjaGlsZHJlbiAoNC02eSBvZiBhZ2UpIGluIHRoaXMgc3R1ZHkuIEhvd2V2ZXIsIHRoZXNlIHlvdW5nZXIgY2hpbGRyZW4gc2hvd2VkIG5vIHNpZ24gb2Ygc3lzdGVtYXRpY2FsbHkgZW5kb3JzaW5nIE1JTkQgbW9yZSBzdHJvbmdseSB0aGFuIEhFQVJU4oCUYW5kIGFjdHVhbGx5IHNob3dlZCB0aGUgb3Bwb3NpdGUgb2YgdGhlIGFkdWx0IHRlbmRlbmN5IGluIHRoZSBjYXNlIG9mIEJPRFkgdnMuIE1JTkQsIGVuZG9yc2luZyBCT0RZIG1vcmUgc3Ryb25nbHkgdGhhbiBNSU5EIGZvciBtb3N0IHRhcmdldCBjaGFyYWN0ZXJzLgoKYGBge3J9CnNjYWxlc19zdHVkeTMgPC0gYmluZF9yb3dzKHNjYWxlc19lZmFfd2RtX2QzX2FkICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgMzogQWR1bHRzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlc19lZmFfd2RtX2QzXzc5ICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgMzogQ2hpbGRyZW4sIDctOXkiKSkgJT4lCiAgc2VsZWN0KC1jKGxvYWRpbmcsIG9yZGVyKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBzcHJlYWQoc3R1ZHksIGZhY3RvcikgJT4lCiAgbXV0YXRlKHVyX2ZhY3RvciA9IGBTdHVkeSAzOiBBZHVsdHNgKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDNfYWQgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXJfYWQgPSBvcmRlcikpICU+JQogIGxlZnRfam9pbihzY2FsZXNfZWZhX3dkbV9kM183OSAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBvcmRlcikgJT4lIHJlbmFtZShvcmRlcl83OSA9IG9yZGVyKSkgJT4lCiAgYXJyYW5nZSh1cl9mYWN0b3IsIG9yZGVyX2FkLCBvcmRlcl83OSkgJT4lCiAgc2VsZWN0KC11cl9mYWN0b3IpICMlPiUKIyBzZWxlY3QoLXN0YXJ0c193aXRoKCJvcmRlciIpKQpgYGAKCmBgYHtyfQpwbG90c19hZ2VncF9kM19zY29yZWRfYWQgPC0gcmVsdml6X2FnZWdwX2Z1bigKICBkX3Njb3JlZCA9IGQzX2FkX3Njb3JlZF9hZCAlPiUgCiAgICBmdWxsX2pvaW4oZDNfNzlfc2NvcmVkX2FkKSAlPiUgCiAgICBmdWxsX2pvaW4oZDNfNDZfc2NvcmVkX2FkKSwgCiAgYWdlX2dyb3VwcyA9IGMoImNoaWxkcmVuNDYiLCAiY2hpbGRyZW43OSIsICJhZHVsdHMiKSwKICBhZ2VfZ3JvdXBfbGFiZWxzID0gYygiQ2hpbGRyZW4sICg0LTZ5KSIsICJDaGlsZHJlbiAoNy05eSkiLCAiQWR1bHRzIiksCiAgY29sb3JzID0gY29sb3JzMDkpCmBgYAoKYGBge3J9CmZpZ19kM19hbGxfc2NvcmVkX2FkX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19hZ2VncF9kM19zY29yZWRfYWRbWzFdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfYWdlZ3BfZDNfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2FnZWdwX2QzX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJEMSIsICJEMiIsICJEMyIpLCBuY29sID0gMykKCmZpZ19kM19hbGxfc2NvcmVkX2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2FnZWdwX2QzX3Njb3JlZF9hZFtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwOSwKICAgICAgICAgICAgICAgICAgICAgICBuYS50cmFuc2xhdGUgPSBGLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpKQoKZmlnX2QzX2FsbF9zY29yZWRfYWRfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZCgKICBmaWdfZDNfYWxsX3Njb3JlZF9hZF9wbG90cywgZmlnX2QzX2FsbF9zY29yZWRfYWRfbGVnLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDNfYWxsX3Njb3JlZF9hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlRyYWNraW5nIGRldmVsb3BtZW50IGJldHdlZW4gNC05eSBhbmQgYWR1bHRob29kIChzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMpIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kM19hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoCiAgZmlnX2QzX2FsbF9zY29yZWRfYWRfdGl0bGUsIGZpZ19kM19hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyfQpmaWd1cmU0LjYgPC0gcGxvdF9ncmlkKGZpZ19kM19hZF9wbG90c19sZWdfdGl0bGUsIAogICAgICAgICAgICAgICAgICAgICAgIGZpZ19kM183OV9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgZmlnX2QzXzQ2X3Bsb3RzX2xlZ190aXRsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgZmlnX2QzX2FsbF9zY29yZWRfYWRfcGxvdHNfbGVnX3RpdGxlLAogICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxKQoKZmlndXJlNC42X2NhcCA8LSBhZGRfc3ViKGZpZ3VyZTQuNiwgc3RyX3dyYXAoIkZpZ3VyZSA0LjY6IFJlbGF0aW9uc2hpcHMgYW1vbmcgVVMgYWR1bHRzJywgb2xkZXIgY2hpbGRyZW4ncywgYW5kIHlvdW5nZXIgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkeSAzLCBzY29yZWQgdXNpbmcgYWR1bHRzJyBCT0RZLCBIRUFSVCwgYW5kIE1JTkQgc2NhbGVzIChzZWUgVGFibGUgNC4xMCkuIChBKSBBZHVsdHMuIChCKSBPbGRlciBjaGlsZHJlbiAoNy05eSBvZiBhZ2UpLiAoQykgWW91bmdlciBjaGlsZHJlbiAoNC02eSBvZiBhZ2UpLiAoRCkgQSB2aXN1YWxpemF0aW9uIG9mIGRldmVsb3BtZW50IGJldHdlZW4gNC05eSBhbmQgYWR1bHRob29kLCB1c2luZyBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYW5kIGFnZSBncm91cC4gUGxvdHMgYXJlIG9yZ2FuaXplZCBieSBzYW1wbGUgKHJvd3MpIGFuZCBieSBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKGNvbHVtbnMpLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMS4gSW4gcGFuZWxzIEEtQywgaW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZC4gUGVhcnNvbiBjb3JyZWxhdGlvbnMgYXJlIHJlcG9ydGVkIGZvciBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cy4iLCAxMTApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDEuOH0KZ2dkcmF3KGZpZ3VyZTQuNl9jYXApCmBgYAoKYGBge3J9CmZpZ3VyZTQuN19wbG90cyA8LSBwbG90X2dyaWQoCiAgcGxvdF9kM19hZF9zY29yZWRfYWRfZGlmZiArCiAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDM6IEFkdWx0cyIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgcGxvdF9kM183OV9zY29yZWRfYWRfZGlmZiArCiAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDM6IENoaWxkcmVuLCA3LTl5IChzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMpIikgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICBwbG90X2QzXzQ2X3Njb3JlZF9hZF9kaWZmICsgCiAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDM6IENoaWxkcmVuLCA0LTZ5IChzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMpIikgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwgCiAgbmNvbCA9IDMsIHJlbF93aWR0aHMgPSBjKDEsIDEsIDEpLAogIGxhYmVscyA9ICJBVVRPIikKCmZpZ3VyZTQuN19wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ3VyZTQuN19wbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2xlZ2VuZChwbG90X2QzX2FkX3Njb3JlZF9hZF9kaWZmKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjEpKQoKZmlndXJlNC43X2NhcCA8LSBhZGRfc3ViKGZpZ3VyZTQuN19wbG90c19sZWcsIHN0cl93cmFwKCJGaWd1cmUgNC43OiBEaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIFVTIGFkdWx0cycgYW5kIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgMy4gdGhpcyBpbmNsdWRlcyBkaWZmZXJlbmNlIHNjb3JlcyB1c2luZyBhZHVsdHMnIEJPRFksIEhFQVJULCBhbmQgTUlORCBzY2FsZXMgKHBhbmVsIEIpIGFuZCBkaWZmZXJlbmNlIHNjb3JlcyB1c2luZyBjaGlsZHJlbidzIG93biBzY2FsZXMgKHBhbmVsIEM7IHNlZSBUYWJsZSA0LjEwKS4gRm9yIGVhY2ggY29uY2VwdHVhbCB1bml0LCBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAwLTEsIHN1Y2ggdGhhdCBkaWZmZXJlbmNlIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIC0xIHRvICsxLiBJbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBhcmUgcGxvdHRlZCBhcyBzbWFsbCwgdHJhbnNsdWNlbnQgY2lyY2xlcywgYW5kIG1lYW4gZGlmZmVyZW5jZSBzY29yZXMgYnkgY2hhcmFjdGVyIGFyZSBwbG90dGVkIGFzIGxhcmdlciwgc29saWQgZGlhbW9uZHMuIEVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFRoZSBkb3R0ZWQgbGluZSBjb3JyZXNwb25kcyB0byBlcXVhbCBlbmRvcnNlbWVudHMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIHBsb3R0ZWQgKGkuZS4sIGEgZGlmZmVyZW5jZSBzY29yZSBvZiAwKS4iLCAxODApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gOCwgZmlnLmFzcCA9IDAuMzh9CmdnZHJhdyhmaWd1cmU0LjdfY2FwKQpgYGAKCmBgYHtyfQpyZWd0YWJfc3R1ZHkzIDwtIHJlZ3RhYl9kM19hZF9zY29yZWRfYWRfZGlmZiAlPiUKICBmdWxsX2pvaW4ocmVndGFiX2QzXzc5X3Njb3JlZF9hZF9kaWZmKSAlPiUKICBmdWxsX2pvaW4ocmVndGFiX2QzXzQ2X3Njb3JlZF9hZF9kaWZmKSAlPiUKICBtdXRhdGVfYXQodmFycyhiLCBzLmUuKSwKICAgICAgICAgICAgZnVucyhmb3JtYXQocm91bmQoLiwgZGlnaXRzID0gMiksIG5zbWFsbCA9IDIpKSkgJT4lCiAgdW5pdGUocmVzdWx0LCBiLCBzLmUuLCBDSTk1LCBub256ZXJvKSAlPiUKICBzcHJlYWQoc3R1ZHksIHJlc3VsdCkgJT4lCiAgc2VwYXJhdGUoYEFkdWx0c2AsIGMoInMyYV9iIiwgInMyYV9zLmUuIiwgInMyYV85NSUgQ0kiLCAiczJhX256IiksIHNlcCA9ICJfIikgJT4lCiAgc2VwYXJhdGUoYENoaWxkcmVuLCA3LTl5ICh1c2luZyBhZHVsdHMnIHNjYWxlcylgLCBjKCJzMmJfYiIsICJzMmJfcy5lLiIsICJzMmJfOTUlIENJIiwgInMyYl9ueiIpLCBzZXAgPSAiXyIpICU+JQogIHNlcGFyYXRlKGBDaGlsZHJlbiwgNC02eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpYCwgYygiczJjX2IiLCAiczJjX3MuZS4iLCAiczJjXzk1JSBDSSIsICJzMmNfbnoiKSwgc2VwID0gIl8iKQpgYGAKCmBgYHtyfQp0YWJsZTQuNiA8LSByZWd0YWJfc3R1ZHkzICU+JQogIHNlbGVjdCgtcGFpciwgLWNvbnRhaW5zKCJzLmUuIikpICU+JQogIHJlbmFtZShQYXJhbWV0ZXIgPSBwYXJhbSkgJT4lCiAgcmVuYW1lX2FsbChmdW5zKGdzdWIoIm56IiwgIiAiLCAuKSkpICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJzMi5fIiwgIiIsIC4pKSkgJT4lCiAga2FibGUoZm9ybWF0ID0gImh0bWwiLCBhbGlnbiA9IGMoImwiLCByZXAoYyhyZXAoInIiLCAyKSwgImwiKSwgMykpLCAKICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDQuNjogUmVncmVzc2lvbiBhbmFseXNlcyBvZiBkaWZmZXJlbmNlIHNjb3JlcyBhbW9uZyBVUyBhZHVsdHMsIG9sZGVyIGNoaWxkcmVuICg3LTl5IG9mIGFnZSksIGFuZCB5b3VuZ2VyIGNoaWxkcmVuICg0LTZ5IG9mIGFnZSkgaW4gU3R1ZHkgMy4gVGhlIHRhYmxlIHByZXNlbnRzIHJlc3VsdHMgZnJvbSBzZXBhcmF0ZSBCYXllc2lhbiByZWdyZXNzaW9ucyBvZiBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyAoQk9EWSB2cy4gSEVBUlQsIEJPRFkgdnMuIE1JTkQsIGFuZCBIRUFSVCB2cy4gTUlORCkuIEVhY2ggcmVncmVzc2lvbiBpbmNsdWRlZCBuaW5lIGZpeGVkIGVmZmVjdCBwYXJhbWV0ZXJzOiAoMSkgdGhlIGludGVyY2VwdCwgd2hpY2ggSSB0cmVhdCBhcyBhbiBpbmRleCBvZiB0aGUgYXN5bW1ldHJ5IGluIGF0dHJpYnV0aW9ucyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgaW4gcXVlc3Rpb247IGFuZCAoMi05KSBhIHNldCBvZiBwYXJhbWV0ZXJzIGVzdGltYXRpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyBhbmQgdGhlIGdyYW5kIG1lYW4gKEdNKS4gVGhlIGludGVyY2VwdHMgYXJlIGhpZ2hsaWdodGVkIGluIGJvbGQsIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBwcmltYXJ5IHBhcmFtZXRlcnMgb2YgaW50ZXJlc3QgZm9yIHRoZXNlIGFuYWx5c2VzLiBGb3IgZWFjaCBwYXJhbWV0ZXIsIHRoZSB0YWJsZSBpbmNsdWRlcyB0aGUgZXN0aW1hdGUgKGIpIGFuZCBhIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBmb3IgdGhhdCBlc3RpbWF0ZS4gQXN0ZXJpc2tzIGluZGljYXRlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbHMgdGhhdCBkbyBub3QgaW5jbHVkZSAwLiIpICU+JSAgCiAga2FibGVfc3R5bGluZygpICU+JQogIHJvd19zcGVjKGMoMSwgMTAsIDE5KSwgYm9sZCA9IFQpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBIRUFSVCIsIDEsIDkpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBNSU5EIiwgMTAsIDE4KSAlPiUKICBncm91cF9yb3dzKCJIRUFSVCAtIE1JTkQiLCAxOSwgMjcpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLAogICAgICAgICAgICAgICAgICAgICAiQWR1bHRzIiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICJDaGlsZHJlbiwgNy05eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpIiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICJDaGlsZHJlbiwgNC02eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpIiA9IDMpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KdGFibGU0LjYKYGBgCgpgYGB7cn0KdGFibGU0LjcgPC0gcmVndGFiX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXBhaXIsIC1zdHVkeSwgLWNvbnRhaW5zKCJzLmUuIikpICU+JQogIG11dGF0ZShiID0gZm9ybWF0KHJvdW5kKGIsIDIpLCBuc21hbGwgPSAyKSkgJT4lCiAgcmVuYW1lKFBhcmFtZXRlciA9IHBhcmFtLAogICAgICAgICBgOTUlIENJYCA9IENJOTUpICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJub256ZXJvIiwgIiAiLCAuKSkpICU+JQogIGthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKGMocmVwKCJyIiwgMiksICJsIiksIDMpKSwgCiAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSA0Ljc6IFJlZ3Jlc3Npb24gYW5hbHlzZXMgb2YgZGlmZmVyZW5jZXMgaW4gZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBVUyBhZHVsdHMgYW5kIGJvdGggb2xkZXIgY2hpbGRyZW4gKDctOXkgb2YgYWdlKSBhbmQgeW91bmdlciBjaGlsZHJlbiAoNC02eSBvZiBhZ2UpIGluIFN0dWR5IDMuIFRoZSB0YWJsZSBwcmVzZW50cyByZXN1bHRzIGZyb20gc2VwYXJhdGUgQmF5ZXNpYW4gcmVncmVzc2lvbnMgb2YgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKEJPRFkgdnMuIEhFQVJULCBCT0RZIHZzLiBNSU5ELCBhbmQgSEVBUlQgdnMuIE1JTkQpLiBFYWNoIHJlZ3Jlc3Npb24gaW5jbHVkZWQgMjcgZml4ZWQgZWZmZWN0IHBhcmFtZXRlcnM6ICgxKSB0aGUgaW50ZXJjZXB0IChmb3IgYWR1bHRzKSwgd2hpY2ggSSB0cmVhdCBhcyBhbiBpbmRleCBvZiB0aGUgYXN5bW1ldHJ5IGluIGF0dHJpYnV0aW9ucyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgaW4gcXVlc3Rpb24gYW1vbmcgYWR1bHRzOyAoMi0zKSB0aGUgb3ZlcmFsbCBkaWZmZXJlbmNlcyBiZXR3ZWVuIG9sZGVyIGNoaWxkcmVuIHZzLiBhZHVsdHMgYW5kIHlvdW5nZXIgY2hpbGRyZW4gdnMuIGFkdWx0cyAoY29sbGFwc2luZyBhY3Jvc3MgdGFyZ2V0IGNoYXJhY3RlcnMpOyAoNC0xMSkgYSBzZXQgb2YgcGFyYW1ldGVycyBlc3RpbWF0aW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMgYW5kIHRoZSBncmFuZCBtZWFuIChHTSksIGFtb25nIGFkdWx0czsgYW5kICgxMi0yNykgdGhlIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZXNlIGRpZmZlcmVuY2UgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyBhbmQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYWdlIGdyb3Vwcy4gVGhlIGRldmVsb3BtZW50YWwgY29tcGFyaXNvbnMgb2YgdGhlIGludGVyY2VwdHMgYXJlIGhpZ2hsaWdodGVkIGluIGJvbGQsIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBwcmltYXJ5IHBhcmFtZXRlcnMgb2YgaW50ZXJlc3QgZm9yIHRoZXNlIGFuYWx5c2VzLiBGb3IgZWFjaCBwYXJhbWV0ZXIsIHRoZSB0YWJsZSBpbmNsdWRlcyB0aGUgZXN0aW1hdGUgKGIpIGFuZCBhIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBmb3IgdGhhdCBlc3RpbWF0ZS4gQXN0ZXJpc2tzIGluZGljYXRlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbHMgdGhhdCBkbyBub3QgaW5jbHVkZSAwLiIpICU+JSAgCiAga2FibGVfc3R5bGluZygpICU+JQogIHJvd19zcGVjKGMoMjozLCAyOTozMCwgNTY6NTcpLCBib2xkID0gVCkgJT4lCiAgZ3JvdXBfcm93cygiQk9EWSAtIEhFQVJUIiwgMSwgMjcpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBNSU5EIiwgMjgsIDU0KSAlPiUKICBncm91cF9yb3dzKCJIRUFSVCAtIE1JTkQiLCA1NSwgODEpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLAogICAgICAgICAgICAgICAgICAgICAiRGV2ZWxvcG1lbnRhbCBjb21wYXJpc29uIiA9IDMpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KdGFibGU0LjcKYGBgCgoKIyBTdHVkeSA0OiBBIGZvY3VzIG9uIGVhcmx5IGNoaWxkaG9vZCAoNC01eSkKClN0dWR5IDQgYnVpbGRzIG9uIFN0dWR5IDMgYnkgcHJvdmlkaW5nIGEgdGFyZ2V0ZWQgaW52ZXN0aWdhdGlvbiBvZiByZXByZXNlbnRhdGlvbnMgb2YgbWVudGFsIGxpZmUgaW4gdGhlIHByZXNjaG9vbCB5ZWFycyAoNC01eSkuIEluIHRoaXMgY2hhcHRlciwgSSBhZ2FpbiBmb2N1cyBvbiB3aGF0IHRoaXMgc3R1ZHkgY2FuIHJldmVhbCBhYm91dCB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgY29uY2VwdHVhbCB1bml0cyBCT0RZLCBIRUFSVCwgYW5kIE1JTkQgYXQgdGhlIGVhcmxpZXN0IHBvaW50IGluIGRldmVsb3BtZW50IHRoYXQgSSBoYXZlIGV4YW1pbmVkIHNvIGZhciwgYW5kIGNvbXBhcmUgdGhpcyBjb25jZXB0dWFsIG9yZ2FuaXphdGlvbiB0byB0aGF0IGRvY3VtZW50ZWQgYW1vbmcgYWR1bHRzLiBBcyBhIHJlbWluZGVyLCBpbiB0aGlzIGNoYXB0ZXIgSSBhbmFseXplIHlvdW5nIGNoaWxkcmVuJ3MgcmVzcG9uc2VzIHdpdGggcmVzcGVjdCB0byB0aGUgIm1hdHVyZSIgY29uY2VwdHVhbCB1bml0cyBCT0RZLCBIRUFSVCwgYW5kIE1JTkQsIGFzIGRlZmluZWQgYnkgRUZBIG9mIF9hZHVsdHMnXyByZXNwb25zZXMgKHNlZSBbWFggQVBQRU5ESVggQj9dIGZvciBmdXJ0aGVyIGFuYWx5c2VzIHdpdGggcmVzcGVjdCB0byB0aGUgY29uY2VwdHVhbCB1bml0cyBpZGVudGlmaWVkIHRocm91Z2ggRUZBIG9mIGNoaWxkcmVuJ3Mgb3duIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMsIGFzIHByZXNlbnRlZCBpbiBDaGFwdGVyIElJSSkuCgpJbiBTdHVkeSA0LCBgciBucm93KGQ0X2FkX3dpZGUpLzJgIFVTIGFkdWx0cyBhbmQgYHIgbnJvdyhkNF80Nl93aWRlKS8yYCBVUyBjaGlsZHJlbiBiZXR3ZWVuIHRoZSBhZ2VzIG9mIGByIHN1bW1hcnkoZDRfNDYkYWdlKVsiTWluLiJdICU+JSByb3VuZCgyKSAlPiUgZm9ybWF0KG5zbWFsbCA9IDIpYC1gciBzdW1tYXJ5KGQ0XzQ2JGFnZSlbIk1heC4iXSAlPiUgcm91bmQoMikgJT4lIGZvcm1hdChuc21hbGwgPSAyKWAgeWVhcnMgKG1lZGlhbjogYHIgc3VtbWFyeShkNF80NiRhZ2UpWyJNZWRpYW4iXSAlPiUgcm91bmQoMikgJT4lIGZvcm1hdChuc21hbGwgPSAyKWB5KSBlYWNoIGFzc2Vzc2VkIHR3byB0YXJnZXQgY2hhcmFjdGVycyBvbiAxOCBtZW50YWwgY2FwYWNpdGllcywgd2l0aCBhbGwgYXNwZWN0cyBvZiB0aGUgZXhwZXJpbWVudGFsIGRlc2lnbiB0YWlsb3JlZCB0byBiZSBhcHByb3ByaWF0ZSBmb3IgdGhpcyB5b3VuZ2VzdCBhZ2UgZ3JvdXAuIFRoaXMgc3R1ZHkgZW1wbG95ZWQgdGhlICJlZGdlIGNhc2UiIHZhcmlhbnQgb2YgdGhlIGdlbmVyYWwgYXBwcm9hY2gsIHdpdGggcGFydGljaXBhbnRzIGFzc2Vzc2luZyBib3RoIGEgYmVldGxlIG9yIGEgcm9ib3QgaW4gc2VxdWVuY2UgKHdpdGggb3JkZXIgY291bnRlcmJhbGFuY2VkIGFjcm9zcyBwYXJ0aWNpcGFudHMpLiAoU2VlIENoYXB0ZXIgSUkgZm9yIGRldGFpbGVkIG1ldGhvZHMuKQoKIyMgUmVzdWx0cwoKIyMjIEFkdWx0cwoKIyMjIyBTY2FsZSBjb25zdHJ1Y3Rpb24KCmBgYHtyfQpzY2FsZXNfZWZhX3dkbV9kNF9hZCA8LSBzY2FsZV9mdW4oZWZhX3dkbV9kNF9hZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfZWZhX3dkbV9kNF9hZCkKZDRfYWRfc2NvcmVkX2FkIDwtIHNjb3JlX2Z1bihkNF9hZCwgc2NhbGVzX2VmYV93ZG1fZDRfYWQpCgpzYXZlUkRTKHNjYWxlc19lZmFfd2RtX2Q0X2FkLCBmaWxlID0gIi4vc3RvcmVkL3NjYWxlcy9zY2FsZXNfZWZhX3dkbV9kNF9hZCIpCnNhdmVSRFMoZDRfYWRfc2NvcmVkX2FkLCBmaWxlID0gIi4vc3RvcmVkL3Njb3JlZF9kYXRhL2Q0X2FkX3Njb3JlZF9hZCIpCmBgYAoKYGBge3J9CnNjYWxlc19zdHVkeTQgPC0gYmluZF9yb3dzKHNjYWxlc19lZmFfd2RtX2Q0X2FkICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgNDogQWR1bHRzIikpICU+JQogIHNlbGVjdCgtYyhsb2FkaW5nLCBvcmRlcikpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgc3ByZWFkKHN0dWR5LCBmYWN0b3IpICU+JQogIG11dGF0ZSh1cl9mYWN0b3IgPSBgU3R1ZHkgNDogQWR1bHRzYCkgJT4lCiAgbGVmdF9qb2luKHNjYWxlc19lZmFfd2RtX2Q0X2FkICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKSAlPiUgcmVuYW1lKG9yZGVyX2FkID0gb3JkZXIpKSAlPiUKICBhcnJhbmdlKHVyX2ZhY3Rvciwgb3JkZXJfYWQpICU+JQogIHNlbGVjdCgtdXJfZmFjdG9yKSAjJT4lCiMgc2VsZWN0KC1zdGFydHNfd2l0aCgib3JkZXIiKSkKYGBgCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiB0aGUgIkdlbmVyYWwgYW5hbHlzaXMgcGxhbiwiIGFib3ZlLCB5aWVsZGVkIGByIGZhY3RfbmFtZV9mdW4oZmFjdG9yX25hbWVzX2VmYV93ZG1fZDRfYWQpYCBzY2FsZXMgb2YgYHIgc2NhbGVzX2VmYV93ZG1fZDRfYWQgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpYCBpdGVtcyBlYWNoOyBzZWUgVGFibGUgNC4xMC4KCiMjIyMgVmlzdWFsaXphdGlvbgoKYGBge3J9CnBsb3RzX2Q0X2FkX3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQ0X2FkX3Njb3JlZF9hZCkKYGBgCgpgYGB7cn0KZmlnX2Q0X2FkX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kNF9hZF9zY29yZWRfYWRbWzFdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2Q0X2FkX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2Q0X2FkX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlnX2Q0X2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2Q0X2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKCmZpZ19kNF9hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kNF9hZF9wbG90cywgZmlnX2Q0X2FkX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kNF9hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDQ6IEFkdWx0cyIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDRfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDRfYWRfdGl0bGUsIGZpZ19kNF9hZF9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKZmlnX2Q0X2FkX3Bsb3RzX2xlZ190aXRsZQpgYGAKClZpc3VhbGl6YXRpb25zIG9mIHJlbGF0aW9uc2hpcHMgYW1vbmcgc2NvcmVzIG9uIHRoZXNlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYXJlIHByb3ZpZGVkIGluIEZpZ3VyZSA0LjgsIHJvdyBBLiBUaGVzZSB2aXN1YWxpemF0aW9ucyBhcmUgYWxsIGV4dHJlbWVseSBzaW1pbGFyIHRvIHRob3NlIGRpc2N1c3NlZCBhdCBsZW5ndGggaW4gcHJldmlvdXMgc3R1ZGllcyBmZWF0dXJpbmcgdGhlc2UgImVkZ2UgY2FzZSIgdGFyZ2V0IGNoYXJhY3RlcnMgKFN0dWRpZXMgMWEtMWMsIFN0dWR5IDIpOyBJIHdpbGwgbm90IGRlc2NyaWJlIHRoZW0gZnVydGhlciBoZXJlLgoKIyMjIyBBbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKSGVyZSBJIHByb3ZpZGUgYSBmb3JtYWwgYW5hbHlzaXMgb2YgdGhlIGFzeW1tZXRyaWVzIGJldHdlZW4gZW5kb3JzZW1lbnRzIG9mIEJPRFksIEhFQVJULCBhbmQgTUlORC4gQXMgaW4gcHJldmlvdXMgc3R1ZGllcywgZm9yIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzLCBJIGNvbmR1Y3QgYSBCYXllc2lhbiByZWdyZXNzaW9uIHRvIGNvbXBhcmUgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiB0aGVzZSB0d28gY29uY2VwdHVhbCB1bml0cyB0byB6ZXJvLCBjb250cm9sbGluZyBmb3IgZGlmZmVyZW5jZXMgaW4gYXNzZXNzbWVudHMgb2YgdGhlIHR3byAiZWRnZSBjYXNlcyIgdGhhdCB3ZXJlIGZlYXR1cmVkIGFzIHRhcmdldCBjaGFyYWN0ZXJzIGluIHRoZXNlIHN0dWRpZXMuIEFzIGluIFN0dWR5IDFkLCBJIGFjY291bnQgZm9yIHRoZSB3aXRoaW4tc3ViamVjdHMgZGVzaWduIGJ5IGluY2x1ZGluZyBtYXhpbWFsIHJhbmRvbSBlZmZlY3RzIHN0cnVjdHVyZXMgKGluIHRoaXMgY2FzZSwgcmFuZG9tIGludGVyY2VwdHMgZm9yIHBhcnRpY2lwYW50cykuIFNlZSBGaWd1cmUgNC45LCBwYW5lbCBELCBmb3IgdmlzdWFsIGRlcGljdGlvbnMgb2YgdGhlc2UgZGlmZmVyZW5jZSBzY29yZXMuCgpgYGB7cn0KZDRfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9mdW4oZDRfYWRfc2NvcmVkX2FkKQpjb250cmFzdHMoZDRfYWRfc2NvcmVkX2FkX2RpZmYkY2hhcmFjdGVyKSA8LSBjb250cmFzdHNfc3VtX2VkZ2UKCnNhdmVSRFMoZDRfYWRfc2NvcmVkX2FkX2RpZmYsICIuL3N0b3JlZC9kaWZmc2NvcmVfZGF0YS9kNF9hZF9zY29yZWRfYWRfZGlmZiIpCmBgYAoKYGBge3J9CnBsb3RfZDRfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQ0X2FkX3Njb3JlZF9hZF9kaWZmKQpgYGAKCmBgYHtyfQojIHJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0X2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kNF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkNF9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpyX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpzdW1tYXJ5KHJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0X2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKc3VtbWFyeShyX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kNF9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX3JlZ190YWJsZV9mdW4oCiAgcmVnX2xpc3QgPSBsaXN0KHJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKICAgICAgICAgICAgICAgICAgcl9kNF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCksCiAgcGFpcl9saXN0ID0gYygiQk9EWSAtIEhFQVJUIiwgIkJPRFkgLSBNSU5EIiwgIkhFQVJUIC0gTUlORCIpLAogIHN0dWR5X25hbWUgPSAiQWR1bHRzIiwKICBjaGFyX2xhYmVsID0gIlJvYm90IHZzLiBHTSIpCmBgYAoKYGBge3J9CiMgaW50ZXJpbSB0YWJsZSBmb3IgZWFzZSBvZiB3cml0aW5nCnJlZ3RhYl9kNF9hZF9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgIyBmaWx0ZXIocGFyYW0gPT0gIkludGVyY2VwdCIpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCnBsb3RfZDRfYWRfc2NvcmVkX2FkX2RpZmYKYGBgCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKQXMgaW4gcHJldmlvdXMgc3R1ZGllcywgYWR1bHRzJyBfQk9EWV8gdnMuIF9IRUFSVF8gZGlmZmVyZW5jZSBzY29yZXMgd2VyZSBzdWJzdGFudGlhbGx5IG5vbi16ZXJvLCBpbiB0aGUgZGlyZWN0aW9uIG9mIHBhcnRpY2lwYW50cyBlbmRvcnNpbmcgX0JPRFlfIGl0ZW1zIG1vcmUgc3Ryb25nbHkgdGhhbiBfSEVBUlRfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQuOCksIGFuZCB0aGlzIGFzeW1tZXRyeSB3YXMgZHJpdmVuIHByaW1hcmlseSBieSBwYXJ0aWNpcGFudHMnIGFzc2Vzc21lbnRzIG9mIHRoZSBiZWV0bGUuIChTZWUgRmlndXJlIDQuOSwgcGFuZWwgQSwgYW5kIHRoZSAiUm9ib3QgdnMuIEdNIiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjguKQoKIyMjIyMgQk9EWSB2cy4gTUlORAoKQXMgaW4gcHJldmlvdXMgc3R1ZGllcywgYWR1bHRzJyBfQk9EWV8gdnMuIF9NSU5EXyBkaWZmZXJlbmNlIHNjb3JlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9CT0RZXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuOCksIGFuZCB0aGlzIGFzeW1tZXRyeSB3YXMgZHJpdmVuIHByaW1hcmlseSBieSBwYXJ0aWNpcGFudHMnIGFzc2Vzc21lbnRzIG9mIHRoZSByb2JvdC4gSW5kZWVkLCBpbiB0aGlzIHN0dWR5LCB0aGlzIGFzeW1tZXRyeSBhY3R1YWxseSB0ZW5kZWQgdG8gZ28gaW4gdGhlIF9vcHBvc2l0ZV8gZGlyZWN0aW9uIGZvciBwYXJ0aWNpcGFudHMnIGFzc2Vzc21lbnRzIG9mIHRoZSBiZWV0bGUgKEJPRFkgZW5kb3JzZW1lbnRzIHN0cm9uZ2VyIHRoYW4gTUlORCBlbmRvcnNlbWVudHMpLCBlY2hvaW5nIGNoaWxkcmVuJ3MgcmVzcG9uc2UgcGF0dGVybnMgaW4gcHJldmlvdXMgc3R1ZGllcy4gKFNlZSBGaWd1cmUgNC45LCBwYW5lbCBBLCBhbmQgdGhlICJSb2JvdCB2cy4gR00iIHJvdyBmb3IgdGhlICJCT0RZLU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC44LikKCiMjIyMjIEhFQVJUIHZzLiBNSU5ECgpBcyBpbiBwcmV2aW91cyBzdHVkaWVzLCBhZHVsdHMnIF9IRUFSVF8gdnMuIF9NSU5EXyBkaWZmZXJlbmNlIHNjb3JlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC44KSwgYW5kIHRoaXMgYXN5bW1ldHJ5IHdhcyBzb21ld2hhdCBleGFnZ2VyYXRlZCBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgcm9ib3QuIChTZWUgRmlndXJlIDQuOSwgcGFuZWwgQSwgYW5kIHRoZSAiUm9ib3QgdnMuIEdNIiByb3cgZm9yIHRoZSAiSEVBUlQtTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjguKQoKIyMjIyBJbnRlcmltIGRpc2N1c3Npb24KCkxpa2UgYWR1bHRzIGluIFN0dWRpZXMgMS0zLCBhZHVsdHMgaW4gU3R1ZHkgNCB0ZW5kZWQgdG8gZW5kb3JzZSBCT0RZIGFuZCBNSU5EIG1vcmUgc3Ryb25nbHkgdGhhbiBIRUFSVC4gQXMgaW4gcHJldmlvdXMgc3R1ZGllcyB0aGF0IHVzZWQgdGhlICJlZGdlIGNhc2UiIHZhcmlhbnQgb2YgdGhlIGV4cGVyaW1lbnRhbCBhcHByb2FjaCwgdGhpcyBzdHVkeSBhbHNvIHJldmVhbGVkIGFuIGFzeW1tZXRyeSBiZXR3ZWVuIEJPRFkgYW5kIE1JTkQsIHdpdGggYWR1bHRzIHRlbmRpbmcgdG8gYXR0cmlidXRlIE1JTkQgbW9yZSBzdHJvbmdseSB0aGFuIEJPRFnigJRob3dldmVyLCB0aGlzIGFzeW1tZXRyeSB3YXMgbGltaXRlZCB0byBhc3Nlc3NtZW50cyBvZiB0aGUgcm9ib3QsIGFuZCBpZiBhbnl0aGluZyByYW4gaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiBmb3IgYXNzZXNzbWVudHMgb2YgdGhlIGJlZXRsZS4KCiMjIyBDaGlsZHJlbiAoNC01eSkKCmBgYHtyfQpkNF80Nl9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQ0XzQ2LCBzY2FsZXNfZWZhX3dkbV9kNF9hZCkKc2F2ZVJEUyhkNF80Nl9zY29yZWRfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NvcmVkX2RhdGEvZDRfNDZfc2NvcmVkX2FkIikKYGBgCgpTdHVkeSA0IHdhcyBleHByZXNzbHkgZGVzaWduZWQgdG8gcHJvdmlkZSB0aGUgYmVzdCBjaGFuY2Ugb2Ygb2JzZXJ2aW5nIGFkdWx0LWxpa2UgY29uY2VwdHVhbCByZXByZXNlbnRhdGlvbnMgYW1vbmcgNC0gdG8gNS15ZWFyLW9sZCBjaGlsZHJlbi4gV2hhdCBkaWQgdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIGxvb2sgbGlrZSBpbiB0aGlzIGFnZSBncm91cCB1bmRlciB0aGVzZSBjaXJjdW1zdGFuY2VzPwoKIyMjIyBWaXN1YWxpemF0aW9uCgpgYGB7cn0KcGxvdHNfZDRfNDZfc2NvcmVkX2FkIDwtIHJlbHZpel9mdW4oZDRfNDZfc2NvcmVkX2FkKQpgYGAKCmBgYHtyfQpmaWdfZDRfNDZfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2Q0XzQ2X3Njb3JlZF9hZFtbMV1dICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDRfNDZfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDRfNDZfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQjEiLCAiQjIiLCAiQjMiKSwgbmNvbCA9IDMpCgpmaWdfZDRfNDZfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDRfNDZfc2NvcmVkX2FkW1sxXV0gKyAKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpKQoKZmlnX2Q0XzQ2X3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlnX2Q0XzQ2X3Bsb3RzLCBmaWdfZDRfNDZfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2Q0XzQ2X3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgNDogQ2hpbGRyZW4sIDQtNXkgKHNjb3JlZCB1c2luZyBhZHVsdHMnIHNjYWxlcykiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2Q0XzQ2X3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoZmlnX2Q0XzQ2X3RpdGxlLCBmaWdfZDRfNDZfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCmZpZ19kNF80Nl9wbG90c19sZWdfdGl0bGUKYGBgCgpWaXN1YWxpemF0aW9ucyBvZiByZWxhdGlvbnNoaXBzIGFtb25nIHNjb3JlcyBvbiBhZHVsdHMnIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYXJlIHByb3ZpZGVkIGluIEZpZ3VyZSA0LjgsIHJvdyBCLgoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkZpcnN0IEkgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIEhFQVJUIChGaWd1cmUgNC44LCBwYW5lbCBCMSkuIEFzIGFtb25nIGFkdWx0cyBpbiB0aGlzIHN0dWR5IChwYW5lbCBBMSksIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzY29yZXMgb24gdGhlIF9CT0RZXyBhbmQgX0hFQVJUXyBzY2FsZXMgYXBwZWFycyB0byBiZSBzb21ld2hhdCBwb3NpdGl2ZSwgYW5kIHRoZXJlIGFwcGVhciB0byBiZSBzb21ld2hhdCBmZXdlciBkYXRhcG9pbnRzIGFib3ZlIHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSkgdGhhbiBiZWxvdyBpdOKAlGJ1dCBib3RoIG9mIHRoZXNlIG9ic2VydmF0aW9ucyBhcmUgbXVjaCBsZXNzIHN0cmlraW5nIGFtb25nIGNoaWxkcmVuIHRoYW4gdGhleSB3ZXJlIGFtb25nIGFkdWx0cy4gV2hpbGUsIGxpa2UgdGhlIHZhc3QgbWFqb3JpdHkgb2YgYWR1bHRzLCBtYW55IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBCT0RZIHRoYW4gSEVBUlQgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24gKHBhcnRpY3VsYXJseSB0byB0aGUgYmVldGxlLCBpbiByZWQpLCBxdWl0ZSBhIGZldyBjaGlsZHJlbiBhdHRyaWJ1dGVkIG1vcmUgSEVBUlQgdGhhbiBCT0RZIChwYXJ0aWN1bGFybHkgdG8gdGhlIHJvYm90LCBpbiBibHVlKS4gCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpOZXh0IEkgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIE1JTkQgKEZpZ3VyZSA0LjgsIHBhbmVsIEIyKS4gQXMgYW1vbmcgYWR1bHRzIGluIHRoaXMgc3R1ZHkgKHBhbmVsIEEyKSwgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIGFwcGVhcnMgdG8gYmUgc29tZXdoYXQgcG9zaXRpdmUuIEhvd2V2ZXIsIHRoZXJlIHdhcyBubyBvYnZpb3VzIGV2aWRlbmNlIG9mIGFueSBhc3ltbWV0cnkgaW4gY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgdGhlc2UgdHdvIGNvbmNlcHR1YWwgdW5pdHMuIEluIG90aGVyIHdvcmRzLCB3aGlsZSwgbGlrZSB0aGUgbWFqb3JpdHkgb2YgYWR1bHRzLCBzb21lIGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBNSU5EIHRoYW4gQk9EWSB0byB0aGUgdGFyZ2V0IGNoYXJhY3RlciBpbiBxdWVzdGlvbiAocGFydGljdWxhcmx5IHRvIHRoZSByb2JvdCwgaW4gYmx1ZSksIG90aGVyIGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBCT0RZIHRoYW4gTUlORCAocGFydGljdWxhcmx5IHRvIHRoZSBiZWV0bGUsIGluIHJlZCkuCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKRmluYWxseSBJIGNvbnNpZGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBIRUFSVCBhbmQgTUlORCAoRmlndXJlIDQuOCwgcGFuZWwgQjMpLiBBcyBhbW9uZyBhZHVsdHMgaW4gdGhpcyBzdHVkeSAocGFuZWwgQTMpLCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfSEVBUlRfIGFuZCBfTUlORF8gc2NhbGVzIGFwcGVhcnMgdG8gYmUgcG9zaXRpdmUsIGFuZCB0aGVyZSBhcHBlYXIgdG8gYmUgc29tZXdoYXQgZmV3ZXIgZGF0YXBvaW50cyBiZWxvdyB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpIHRoYW4gYWJvdmUgaXTigJRidXQsIGFzIGluIHRoZSBwcmV2aW91cyBzZWN0aW9ucywgYm90aCBvZiB0aGVzZSBvYnNlcnZhdGlvbnMgYXJlIG11Y2ggbGVzcyBzdHJpa2luZyBhbW9uZyBjaGlsZHJlbiB0aGFuIHRoZXkgd2VyZSBhbW9uZyBhZHVsdHMuIEluIG90aGVyIHdvcmRzLCB3aGlsZSBtYW55IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBNSU5EIHRoYW4gSEVBUlQgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24gKGxpa2UgdGhlIHZhc3QgbWFqb3JpdHkgb2YgYWR1bHRzKSwgcXVpdGUgYSBmZXcgY2hpbGRyZW4gYXR0cmlidXRlZCBhdCBsZWFzdCBzbGlnaHRseSBtb3JlIEhFQVJUIHRoYW4gTUlORC4gVGhpcyBhcHBlYXJzIHRvIGhhdmUgYmVlbiB0cnVlIGZvciBib3RoIHRhcmdldCBjaGFyYWN0ZXJzLgoKIyMjIyMgR2VuZXJhbCBvYnNlcnZhdGlvbnMgYWJvdXQgZGV2ZWxvcG1lbnQKCkZvciBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cywgdGhlc2UgdmlzdWFsaXphdGlvbnMgc3VnZ2VzdCB0aGF0IGNoaWxkcmVuJ3MgcmVzcG9uc2VzIHdlcmUgZ2VuZXJhbGx5IGxlc3MgYXN5bW1ldHJpY2FsIHRoYW4gdGhvc2Ugb2YgYWR1bHRzLiBUaGlzIGlzIHBlcmhhcHMgZWFzaWVzdCB0byBvYnNlcnZlIGluIEZpZ3VyZSA0LjgsIHJvdyBELCB3aGljaCBwcmVzZW50cyAoaHlwb3RoZXRpY2FsKSAibW92ZW1lbnQiIGJldHdlZW4gdGhlIG1lYW4gcGxhY2VtZW50IGZvciBhIHRhcmdldCBjaGFyYWN0ZXIgYW1vbmcgY2hpbGRyZW4gKGJlZ2lubmluZyBvZiBhcnJvdykgYW5kIHRoZSBtZWFuIHBsYWNlbWVudCBmb3IgYSB0YXJnZXQgY2hhcmFjdGVyIGFtb25nIGFkdWx0cyAoYXJyb3doZWFkKSwgZm9yIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzLiBJbiBlYWNoIGNhc2UsIHRoaXMgIm1vdmVtZW50IiBlaXRoZXIgbWFpbnRhaW5zIGEgc2ltaWxhciBkaXN0YW5jZSBmcm9tIHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkKSAoYXMgd2l0aCBtZWFuIGFzc2Vzc21lbnRzIG9mIHRoZSByb2JvdCBpbiB0aGUgQk9EWSB2cy4gSEVBUlQgc3BhY2UsIHBhbmVsIEQxOyBhbmQgdGhlIGJlZXRsZSBpbiB0aGUgQk9EWSB2cy4gTUlORCBzcGFjZSwgcGFuZWwgRDIpIG9yIG1vdmVzIGF3YXkgZnJvbSB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSB0b3dhcmQgdGhlIHVwcGVyIGxlZnQgYW5kIGxvd2VyIHJpZ2h0IGNvcm5lcnMgb2YgdGhlIHBsb3QgKGFzIHdpdGggbWVhbiBhc3Nlc3NtZW50cyBvZiB0aGUgYmVldGxlIGluIHRoZSBCT0RZIHZzLiBIRUFSVCBzcGFjZSwgcGFuZWwgRDE7IHRoZSByb2JvdCBpbiB0aGUgQk9EWSB2cy4gTUlORCBzcGFjZSwgcGFuZWwgRDI7IGFuZCBib3RoIGNoYXJhY3RlcnMgaW4gdGhlIEhFQVJUIHZzLiBNSU5EIHNwYWNlLCBwYW5lbCBEMykuIEFuYWx5c2lzIG9mIGNoYW5nZXMgaW4gX2Fic29sdXRlXyBhdHRyaWJ1dGlvbnMgb2YgQk9EWSwgSEVBUlQsIGFuZCBNSU5ELCBpcyBwdXJzdWVkIGluIENoYXB0ZXIgVjsgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUgY3VycmVudCBjaGFwdGVyLCB0aGUgcHJpbWFyeSBvYnNlcnZhdGlvbiBvZiBpbnRlcmVzdCBpcyB0aGF0IHRoZXNlICJzaGlmdHMiIGJldHdlZW4gY2hpbGQgYW5kIGFkdWx0IGFzc2Vzc21lbnRzIG9mIHRoZXNlIGNoYXJhY3RlcnMgZ2VuZXJhbGx5IHBvaW50IGluIHRoZSBkaXJlY3Rpb24gb2Ygc3RhYmxlIG9yIGluY3JlYXNpbmcgKG5vdCBkZWNyZWFzaW5nKSBhc3ltbWV0cmllcyBvdmVyIGRldmVsb3BtZW50YWwgdGltZS4KCiMjIyMgQW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKCkhlcmUgSSBwcm92aWRlIGEgZm9ybWFsIGFuYWx5c2lzIG9mIHRoZXNlIGFzeW1tZXRyaWVzIGFtb25nIGNvbmNlcHR1YWwgdW5pdHMsIGNvbnRyb2xsaW5nIGZvciBkaWZmZXJlbmNlcyBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgdHdvICJlZGdlIGNhc2VzIiB0aGF0IHdlcmUgZmVhdHVyZWQgYXMgdGFyZ2V0IGNoYXJhY3RlcnMgaW4gdGhlc2Ugc3R1ZGllcyAoYmVldGxlIGFuZCByb2JvdCksIGFuZCBhY2NvdW50aW5nIGZvciB0aGUgd2l0aGluLXN1YmplY3RzIGRlc2lnbiBvZiB0aGlzIHN0dWR5IGJ5IGluY2x1ZGluZyBtYXhpbWFsIHJhbmRvbSBlZmZlY3RzIHN0cnVjdHVyZXMgKGluIHRoaXMgY2FzZSwgcmFuZG9tIGludGVyY2VwdHMgZm9yIHBhcnRpY2lwYW50cykuIFNlZSBGaWd1cmUgNC45LCBwYW5lbCBCLCBmb3IgdmlzdWFsIGRlcGljdGlvbnMgb2YgdGhlc2UgZGlmZmVyZW5jZSBzY29yZXMuCgpgYGB7cn0KZDRfNDZfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9mdW4oZDRfNDZfc2NvcmVkX2FkKQpjb250cmFzdHMoZDRfNDZfc2NvcmVkX2FkX2RpZmYkY2hhcmFjdGVyKSA8LSBjb250cmFzdHNfc3VtX2VkZ2UKCnNhdmVSRFMoZDRfNDZfc2NvcmVkX2FkX2RpZmYsICIuL3N0b3JlZC9kaWZmc2NvcmVfZGF0YS9kNF80Nl9zY29yZWRfYWRfZGlmZiIpCmBgYAoKYGBge3J9CnBsb3RfZDRfNDZfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQ0XzQ2X3Njb3JlZF9hZF9kaWZmKQpgYGAKCmBgYHtyfQojIHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF80Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kNF80Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkNF80Nl9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpyX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpzdW1tYXJ5KHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF80Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKc3VtbWFyeShyX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kNF80Nl9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX3JlZ190YWJsZV9mdW4oCiAgcmVnX2xpc3QgPSBsaXN0KHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKICAgICAgICAgICAgICAgICAgcl9kNF80Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCksCiAgcGFpcl9saXN0ID0gYygiQk9EWSAtIEhFQVJUIiwgIkJPRFkgLSBNSU5EIiwgIkhFQVJUIC0gTUlORCIpLAogIHN0dWR5X25hbWUgPSAiQ2hpbGRyZW4sIDQtNXkgKHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsCiAgY2hhcl9sYWJlbCA9ICJSb2JvdCB2cy4gR00iKQpgYGAKCmBgYHtyfQojIGludGVyaW0gdGFibGUgZm9yIGVhc2Ugb2Ygd3JpdGluZwpyZWd0YWJfZDRfNDZfc2NvcmVkX2FkX2RpZmYgJT4lCiAgc2VsZWN0KC1zdHVkeSwgLXMuZS4pICU+JQogICMgZmlsdGVyKHBhcmFtID09ICJJbnRlcmNlcHQiKSAlPiUKICBrYWJsZShkaWdpdHMgPSAyKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpwbG90X2Q0XzQ2X3Njb3JlZF9hZF9kaWZmCmBgYAoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkFzIGFtb25nIGFkdWx0cywgYW1vbmcgY2hpbGRyZW4gX0JPRFlfIHZzLiBfSEVBUlRfIGRpZmZlcmVuY2Ugc2NvcmVzIHdlcmUgc2lnbmlmaWNhbnRseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9CT0RZXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0hFQVJUXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LjgpLiBIb3dldmVyLCB0aGlzIGFzeW1tZXRyeSB3YXMgcmVkdWNlZCB0byB6ZXJvIGZvciBhc3Nlc3NtZW50cyBvZiB0aGUgcm9ib3QgKHNlZSBGaWd1cmUgNC45LCBwYW5lbCBCLCBhbmQgdGhlICJSb2JvdCB2cy4gR00iIHJvdyBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQuOCkuICAKCiMjIyMjIEJPRFkgdnMuIE1JTkQKCkluIGNvbnRyYXN0IHRvIGFkdWx0cywgYW1vbmcgY2hpbGRyZW4gX0JPRFlfIHZzLiBfTUlORF8gZGlmZmVyZW5jZSBzY29yZXMgd2VyZSBub3QgZGlmZmVyZW50aWFibGUgZnJvbSB6ZXJvIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJCT0RZLU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC44KS4gVGhpcyBhcHBlYXJzIHRvIGJlIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSBhc3ltbWV0cnkgcmFuIGluIGRpZmZlcmVudCBkaXJlY3Rpb25zIGZvciB0aGUgdHdvIHRhcmdldCBjaGFyYWN0ZXJzIChzZWUgRmlndXJlIDQuOSwgcGFuZWwgQiwgYW5kIHRoZSAiUm9ib3QgdnMuIEdNIiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQuOCkuICAKCiMjIyMjIEhFQVJUIHZzLiBNSU5ECgpBcyBhbW9uZyBhZHVsdHMsIGFtb25nIGNoaWxkcmVuIF9IRUFSVF8gdnMuIF9NSU5EXyBkaWZmZXJlbmNlIHNjb3JlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC44KTsgdGhpcyBkaWZmZXJlbmNlIGRpZCBub3QgdmFyeSBhY3Jvc3MgdGFyZ2V0IGNoYXJhY3RlcnMgKHNlZSB0aGUgIlJvYm90IHZzLiBHTSIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC44KS4KCiMjIyMgSW50ZXJpbSBkaXNjdXNzaW9uCgpVc2luZyBhIHBhcnRpY3VsYXJseSBjaGlsZC1mcmllbmRseSBwYXJhZGlnbSwgNC0gdG8gNS15ZWFyLW9sZCBjaGlsZHJlbiB3ZXJlIHJlbGF0aXZlbHkgImFkdWx0LWxpa2UiIiBpbiB0aGVpciB0ZW5kZW5jaWVzIHRvIGVuZG9yc2UgQk9EWSBhbmQgTUlORCBtb3JlIHN0cm9uZ2x5IHRoYW4gSEVBUlQsIGJ1dCBmYWlsZWQgdG8gc2hvdyB0aGUgYWR1bHQtbGlrZSB0ZW5kZW5jeSB0byBlbmRvcnNlIE1JTkQgbW9yZSBzdHJvbmdseSB0aGFuIEJPRFkgZm9yIHRoZXNlIHR3byBlZGdlIGNhc2VzLiBJbnN0ZWFkLCBsaWtlIG9sZGVyIGNoaWxkcmVuIGluIFN0dWRpZXMgMiBhbmQgMywgdGhlIGFzeW1tZXRyeSBiZXR3ZWVuIEJPRFkgYW5kIE1JTkQgYXBwZWFyZWQgdG8gYmUgaGlnaGx5IGNvbnRpbmdlbnQgb24gd2hpY2ggdGFyZ2V0IHdhcyBiZWluZyBhc3Nlc3NlZC4KCmBgYHtyfQpwbG90c19hZ2VncF9kNF9zY29yZWRfYWQgPC0gcmVsdml6X2FnZWdwX2Z1bigKICBkX3Njb3JlZCA9IGQ0X2FkX3Njb3JlZF9hZCAlPiUgCiAgICBmdWxsX2pvaW4oZDRfNDZfc2NvcmVkX2FkKSwgCiAgYWdlX2dyb3VwcyA9IGMoImNoaWxkcmVuNDYiLCAiYWR1bHRzIiksCiAgYWdlX2dyb3VwX2xhYmVscyA9IGMoIkNoaWxkcmVuICg0LTV5KSIsICJBZHVsdHMiKSwKICBjb2xvcnMgPSBjb2xvcnMwMikKYGBgCgpgYGB7cn0KZmlnX2Q0X2FsbF9zY29yZWRfYWRfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2FnZWdwX2Q0X3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19hZ2VncF9kNF9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfYWdlZ3BfZDRfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkMxIiwgIkMyIiwgIkMzIiksIG5jb2wgPSAzKQoKZmlnX2Q0X2FsbF9zY29yZWRfYWRfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfYWdlZ3BfZDRfc2NvcmVkX2FkW1sxXV0gKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgIG5hLnRyYW5zbGF0ZSA9IEYsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkpCgpmaWdfZDRfYWxsX3Njb3JlZF9hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKAogIGZpZ19kNF9hbGxfc2NvcmVkX2FkX3Bsb3RzLCBmaWdfZDRfYWxsX3Njb3JlZF9hZF9sZWcsCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kNF9hbGxfc2NvcmVkX2FkX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiVHJhY2tpbmcgZGV2ZWxvcG1lbnQgYmV0d2VlbiA0LTV5IGFuZCBhZHVsdGhvb2QgKHNjb3JlZCB1c2luZyBhZHVsdHMnIHNjYWxlcykiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2Q0X2FsbF9zY29yZWRfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZCgKICBmaWdfZDRfYWxsX3Njb3JlZF9hZF90aXRsZSwgZmlnX2Q0X2FsbF9zY29yZWRfYWRfcGxvdHNfbGVnLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3J9CmZpZ3VyZTQuOCA8LSBwbG90X2dyaWQoZmlnX2Q0X2FkX3Bsb3RzX2xlZ190aXRsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgZmlnX2Q0XzQ2X3Bsb3RzX2xlZ190aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICBmaWdfZDRfYWxsX3Njb3JlZF9hZF9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEpCgpmaWd1cmU0LjhfY2FwIDwtIGFkZF9zdWIoZmlndXJlNC44LCBzdHJfd3JhcCgiRmlndXJlIDQuODogUmVsYXRpb25zaGlwcyBhbW9uZyBVUyBhZHVsdHMnLCBvbGRlciBjaGlsZHJlbidzLCBhbmQgeW91bmdlciBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBjb25jZXB0dWFsIHVuaXRzIGluIFN0dWR5IDQsIHNjb3JlZCB1c2luZyBhZHVsdHMnIEJPRFksIEhFQVJULCBhbmQgTUlORCBzY2FsZXMgKHNlZSBUYWJsZSA0LjEwKS4gUGxvdHMgYXJlIG9yZ2FuaXplZCBieSBzYW1wbGUgKHJvd3MpIGFuZCBieSBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKGNvbHVtbnMpLiAoQSkgQWR1bHRzLiAoQikgQ2hpbGRyZW4gKDQtNnkgb2YgYWdlKSwgc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzLiAoQykgQSB2aXN1YWxpemF0aW9uIG9mIGRldmVsb3BtZW50IGJldHdlZW4gNC02eSBhbmQgYWR1bHRob29kLCB1c2luZyBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYW5kIGFnZSBncm91cC4gRm9yIGVhY2ggY29uY2VwdHVhbCB1bml0LCBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAwLTEuIEluIHBhbmVscyBBLUIsIGluZGl2aWR1YWwgcGFydGljaXBhbnRzIGFyZSBwbG90dGVkIGFzIHNtYWxsLCB0cmFuc2x1Y2VudCBjaXJjbGVzLCBhbmQgbWVhbiBzY29yZXMgYnkgY2hhcmFjdGVyIGFyZSBwbG90dGVkIGFzIGxhcmdlciwgc29saWQgZGlhbW9uZHMuIEVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFRoZSBkb3R0ZWQgbGluZSBjb3JyZXNwb25kcyB0byBlcXVhbCBlbmRvcnNlbWVudHMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIHBsb3R0ZWQuIFBlYXJzb24gY29ycmVsYXRpb25zIGFyZSByZXBvcnRlZCBmb3IgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMuIiwgMTEwKSwgeCA9IDAsIGhqdXN0ID0gMCkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxLjR9CmdnZHJhdyhmaWd1cmU0LjhfY2FwKQpgYGAKCiMjIyBEZXZlbG9wbWVudGFsIGNvbXBhcmlzb24KCkluIHRoZSBwcmV2aW91cyBzZWN0aW9ucywgSSBhbmFseXplZCBhZHVsdHMnIGFuZCBjaGlsZHJlbidzIHJlc3BvbnNlcyBzZXBhcmF0ZWx5LiBIZXJlIEkgY29uZHVjdCBhIGZvcm1hbCBjb21wYXJpc29uIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gY29uY2VwdHVhbCB1bml0cyBhbW9uZyB0aGVzZSB0d28gYWdlIGdyb3VwcywgdG8gYXNzZXNzIHRoZSBzaXplIGFuZCByb2J1c3RuZXNzIG9mIHRoZXNlIG9zdGVuc2l2ZSBkZXZlbG9wbWVudGFsIGRpZmZlcmVuY2VzLiBJIHBvb2xlZCBkYXRhIGZyb20gYm90aCBhZ2UgZ3JvdXBzIGFuZCBtb2RpZmllZCBteSByZWdyZXNzaW9uIGFuYWx5c2VzIHRvIGluY2x1ZGUgYSBtYWluIGVmZmVjdCBvZiBhZ2UgZ3JvdXAgKGNvbXBhcmluZyBjaGlsZHJlbidzIGRpZmZlcmVuY2Ugc2NvcmVzIHRvIHRoZSBiYXNlbGluZSBzZXQgYnkgYWR1bHRzKSBhbmQgYW4gaW50ZXJhY3Rpb24gYmV0d2VlbiBhZ2UgZ3JvdXAgYW5kIHRhcmdldCBjaGFyYWN0ZXIgKGFzc2Vzc2luZyB3aGV0aGVyIHRoZSBvYnNlcnZlZCBkaWZmZXJlbmNlcyBiZXR3ZWVuIGNoYXJhY3RlcnMgdmFyaWVkIGJ5IGFnZSBncm91cCkuCgpgYGB7cn0KZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZiA8LSBmdWxsX2pvaW4oZDRfYWRfc2NvcmVkX2FkX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ0XzQ2X3Njb3JlZF9hZF9kaWZmKSAlPiUKICBtdXRhdGUoYWdlX2dyb3VwID0gZmFjdG9yKGFnZV9ncm91cCkpCmNvbnRyYXN0cyhkNF9hZDQ2X3Njb3JlZF9hZF9kaWZmJGNoYXJhY3RlcikgPC0gY29udHJhc3RzX3N1bV9lZGdlCmNvbnRyYXN0cyhkNF9hZDQ2X3Njb3JlZF9hZF9kaWZmJGFnZV9ncm91cCkgPC0gY29udHJhc3RzX2R1bTJfYWdlZ3AKYGBgCgpgYGB7cn0KIyByX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciAqIGFnZV9ncm91cCArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0X2FkNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnN1bW1hcnkocl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciAqIGFnZV9ncm91cCArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0X2FkNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpzdW1tYXJ5KHJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKiBhZ2VfZ3JvdXAgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkNF9hZDQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpyX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCmBgYHtyfQpyZWd0YWJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX3JlZ190YWJsZV9mdW4oCiAgcmVnX2xpc3QgPSBsaXN0KHJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAogICAgICAgICAgICAgICAgICByX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCksCiAgcGFpcl9saXN0ID0gYygiQk9EWSAtIEhFQVJUIiwgIkJPRFkgLSBNSU5EIiwgIkhFQVJUIC0gTUlORCIpLAogIHN0dWR5X25hbWUgPSAiRGV2ZWxvcG1lbnRhbCBjb21wYXJpc29uIiwKICBjaGFyX2xhYmVsID0gIlJvYm90IHZzLiBHTSIsIAogIGFnZWdwX2xhYmVsID0gIkNoaWxkcmVuIHZzLiBhZHVsdHMiKQpgYGAKCmBgYHtyfQojIGludGVyaW0gdGFibGUgZm9yIGVhc2Ugb2Ygd3JpdGluZwpyZWd0YWJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgIyBmaWx0ZXIocGFyYW0gJWluJSBjKCJDaGlsZHJlbiB2cy4gYWR1bHRzIiwgIkludGVyYWN0aW9uIikpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCnBsb3RfZ3JpZChwbG90X2Q0X2FkX3Njb3JlZF9hZF9kaWZmLCBwbG90X2Q0XzQ2X3Njb3JlZF9hZF9kaWZmLCBuY29sID0gMikKYGBgCgpGb3IgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKEJPRFkgdnMuIEhFQVJULCBCT0RZIHZzLiBNSU5ELCBIRUFSVCB2cy4gTUlORCksIGNoaWxkcmVuJ3MgZGlmZmVyZW5jZSBzY29yZXMgd2VyZSBzdWJzdGFudGlhbGx5IGF0dGVudWF0ZWQgKGNsb3NlciB0byB6ZXJvKSwgYXMgY29tcGFyZWQgdG8gYWR1bHRzIChzZWUgdGhlICJDaGlsZHJlbiB2cy4gYWR1bHRzIiByb3dzIGZvciBlYWNoIGNvbXBhcmlzb24gaW4gVGFibGUgNC45KSwgYW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMgd2FzIGFsc28gYXR0ZW51YXRlZCBhbW9uZyBjaGlsZHJlbiAoc2VlIHRoZSAiUm9ib3QgdnMuIEdNIiByb3dzIGZvciBlYWNoIGNvbXBhcmlzb24gaW4gVGFibGUgNC45KS4KCiMjIERpc2N1c3Npb24KClN0dWR5IDQgcHJvdmlkZXMgeWV0IG1vcmUgY29uZmlybWF0aW9uIG9mIHRoZSByb2J1c3RuZXNzIG9mIHRoZSBhc3ltbWV0cmljIHJlbGF0aW9uc2hpcHMgYW1vbmcgY29uY2VwdHVhbCB1bml0cyBpbiBhZHVsdHMnIHJlcHJlc2VudGF0aW9ucyBvZiBtZW50YWwgbGlmZSBhcyByZXZlYWxlZCBieSBTdHVkaWVzIDEtMyAodXNpbmcgeWV0IGFub3RoZXIgc2V0IG9mIG1lbnRhbCBjYXBhY2l0aWVzIGFuZCBhIHdpdGhpbi1zdWJqZWN0cyBkZXNpZ24pOiBZZXQgYWdhaW4sIGFkdWx0cyBzeXN0ZW1hdGljYWxseSBlbmRvcnNlZCBib3RoIEJPRFkgYW5kIE1JTkQgYXQgbGVhc3QgYXMgc3Ryb25nbHksIGFuZCBvZnRlbiBtb3JlIHN0cm9uZ2x5LCB0aGFuIEhFQVJUIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggdGFyZ2V0IGNoYXJhY3RlciB0aGV5IGFzc2Vzc2VkLCB3aGlsZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk9EWSBhbmQgTUlORCB3YXMgY29udGluZ2VudCBvbiB0aGUgdGFyZ2V0IGNoYXJhY3RlciB1bmRlciBldmFsdWF0aW9uLgoKVGhpcyBzdHVkeSBhbHNvIHN1cHBvcnRzIGFuZCBleHRlbmRzIHRoZSBkZXZlbG9wbWVudGFsIHN0b3J5IHRoYXQgdW5mb2xkZWQgdGhyb3VnaCBTdHVkaWVzIDIgYW5kIDMuIEFzIGluIFN0dWR5IDMsIHRoZSB5b3VuZyBjaGlsZHJlbiAoNC01eSBvZiBhZ2UpIGluIHRoaXMgc3R1ZHkgc2hvd2VkIGFuIGFkdWx0LWxpa2UgdGVuZGVuY3kgdG8gZW5kb3JzZSBCT0RZIG1vcmUgc3Ryb25nbHkgdGhhbiBIRUFSVC4gTW9yZXZlciwgaW4gdGhpcyBwYXJ0aWN1bGFybHkgY2hpbGQtZnJpZW5kbHkgZXhwZXJpbWVudGFsIHBhcmFkaWdtLCB0aGVzZSBjaGlsZHJlbiBhbHNvIHNob3dlZCBhbiBlbWVyZ2VudCBhZHVsdC1saWtlIHRlbmRlbmN5IHRvIGVuZG9yc2UgTUlORCBtb3JlIHN0cm9uZ2x5IHRoYW4gSEVBUlQsIHRob3VnaCB0aGlzIGFzeW1tZXRyeSB3YXMgbXVjaCB3ZWFrZXIgYW1vbmcgY2hpbGRyZW4gdGhhbiBhbW9uZyBhZHVsdHMuIEluIGNvbnRyYXN0IHRvIHRoZSB1bi1hZHVsdC1saWtlIHRlbmRlbmN5IGFtb25nICJ5b3VuZ2VyIiAoNC0gdG8gNi15ZWFyLW9sZCkgY2hpbGRyZW4gaW4gU3R1ZHkgMyB0byBlbmRvcnNlIEJPRFkgbW9yZSBzdHJvbmdseSB0aGFuIE1JTkQsIGluIFN0dWR5IDMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIE1JTkQgYW1vbmcgdGhlIHlvdW5nIGNoaWxkcmVuIGluIHRoaXMgc2FtcGxlIHZhcmllZCBieSB0YXJnZXQgY2hhcmFjdGVyLCBtdWNoIGFzIGl0IGRpZCBhbW9uZyBhZHVsdHMuIEluIHN1bSwgaW4gYWxsIHJlc3BlY3RzIHRoZSA0LSB0byA1LXllYXItb2xkIGNoaWxkcmVuIGluIHRoaXMgc3R1ZHkgZGVtb25zdHJhdGVkIGEgbW9yZSBhZHVsdC1saWtlIChhbGJlaXQgYXR0ZW51YXRlZCkgc2Vuc2Ugb2YgdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIHRoYW4gdGhlaXIgc2ltaWxhci1hZ2VkIHBlZXJzIGluIFN0dWR5IDMuCgpgYGB7cn0KcGxvdHNfYWdlZ3BfZDRfc2NvcmVkX2FkIDwtIHJlbHZpel9hZ2VncF9mdW4oCiAgZF9zY29yZWQgPSBkNF9hZF9zY29yZWRfYWQgJT4lIAogICAgZnVsbF9qb2luKGQ0XzQ2X3Njb3JlZF9hZCksIAogIGFnZV9ncm91cHMgPSBjKCJjaGlsZHJlbjQ2IiwgImFkdWx0cyIpLAogIGFnZV9ncm91cF9sYWJlbHMgPSBjKCJDaGlsZHJlbiwgKDQtNXkpIiwgIkFkdWx0cyIpLAogIGNvbG9ycyA9IGNvbG9yczAyKQpgYGAKCmBgYHtyfQpmaWdfZDRfYWxsX3Njb3JlZF9hZF9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfYWdlZ3BfZDRfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2FnZWdwX2Q0X3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19hZ2VncF9kNF9zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRDEiLCAiRDIiLCAiZDQiKSwgbmNvbCA9IDMpCgpmaWdfZDRfYWxsX3Njb3JlZF9hZF9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19hZ2VncF9kNF9zY29yZWRfYWRbWzFdXSArIAogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLCBuYS50cmFuc2xhdGUgPSBGLCAKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKCmZpZ19kNF9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlnX2Q0X2FsbF9zY29yZWRfYWRfcGxvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlnX2Q0X2FsbF9zY29yZWRfYWRfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDRfYWxsX3Njb3JlZF9hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlRyYWNraW5nIGRldmVsb3BtZW50IGJldHdlZW4gNC01eSBhbmQgYWR1bHRob29kIChzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMpIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kNF9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoCiAgZmlnX2Q0X2FsbF9zY29yZWRfYWRfdGl0bGUsIGZpZ19kNF9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyfQpmaWd1cmU0LjlfcGxvdHMgPC0gcGxvdF9ncmlkKAogIHBsb3RfZDRfYWRfc2NvcmVkX2FkX2RpZmYgKwogICAgbGFicyh0aXRsZSA9ICJTdHVkeSA0OiBBZHVsdHMiKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiksCiAgcGxvdF9kNF80Nl9zY29yZWRfYWRfZGlmZiArIAogICAgbGFicyh0aXRsZSA9ICJTdHVkeSA0OiBDaGlsZHJlbiwgNC01eSAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwgCiAgbmNvbCA9IDIsIHJlbF93aWR0aHMgPSBjKDEsIDEpLAogIGxhYmVscyA9ICJBVVRPIikKCmZpZ3VyZTQuOV9jYXAgPC0gYWRkX3N1YihmaWd1cmU0LjlfcGxvdHMsIHN0cl93cmFwKCJGaWd1cmUgNC45OiBEaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIFVTIGFkdWx0cycgYW5kIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgNC4gRm9yIGVhY2ggY29uY2VwdHVhbCB1bml0LCBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAwLTEsIHN1Y2ggdGhhdCBkaWZmZXJlbmNlIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIC0xIHRvICsxLiBJbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBhcmUgcGxvdHRlZCBhcyBzbWFsbCwgdHJhbnNsdWNlbnQgY2lyY2xlcywgYW5kIG1lYW4gZGlmZmVyZW5jZSBzY29yZXMgYnkgY2hhcmFjdGVyIGFyZSBwbG90dGVkIGFzIGxhcmdlciwgc29saWQgZGlhbW9uZHMuIEVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFRoZSBkb3R0ZWQgbGluZSBjb3JyZXNwb25kcyB0byBlcXVhbCBlbmRvcnNlbWVudHMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIHBsb3R0ZWQgKGkuZS4sIGEgZGlmZmVyZW5jZSBzY29yZSBvZiAwKS4iLCAxODApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gOCwgZmlnLmFzcCA9IDAuMzh9CmdnZHJhdyhmaWd1cmU0LjlfY2FwKQpgYGAKCmBgYHtyfQpyZWd0YWJfc3R1ZHk0IDwtIHJlZ3RhYl9kNF9hZF9zY29yZWRfYWRfZGlmZiAlPiUKICBmdWxsX2pvaW4ocmVndGFiX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmKSAlPiUKICBtdXRhdGVfYXQodmFycyhiLCBzLmUuKSwKICAgICAgICAgICAgZnVucyhmb3JtYXQocm91bmQoLiwgZGlnaXRzID0gMiksIG5zbWFsbCA9IDIpKSkgJT4lCiAgdW5pdGUocmVzdWx0LCBiLCBzLmUuLCBDSTk1LCBub256ZXJvKSAlPiUKICBzcHJlYWQoc3R1ZHksIHJlc3VsdCkgJT4lCiAgc2VwYXJhdGUoYEFkdWx0c2AsIGMoInM0YV9iIiwgInM0YV9zLmUuIiwgInM0YV85NSUgQ0kiLCAiczRhX256IiksIHNlcCA9ICJfIikgJT4lCiAgc2VwYXJhdGUoYENoaWxkcmVuLCA0LTV5ICh1c2luZyBhZHVsdHMnIHNjYWxlcylgLCBjKCJzNGJfYiIsICJzNGJfcy5lLiIsICJzNGJfOTUlIENJIiwgInM0Yl9ueiIpLCBzZXAgPSAiXyIpCmBgYAoKYGBge3J9CnRhYmxlNC44IDwtIHJlZ3RhYl9zdHVkeTQgJT4lCiAgc2VsZWN0KC1wYWlyLCAtY29udGFpbnMoInMuZS4iKSkgJT4lCiAgcmVuYW1lKFBhcmFtZXRlciA9IHBhcmFtKSAlPiUKICByZW5hbWVfYWxsKGZ1bnMoZ3N1YigibnoiLCAiICIsIC4pKSkgJT4lCiAgcmVuYW1lX2FsbChmdW5zKGdzdWIoInM0Ll8iLCAiIiwgLikpKSAlPiUKICBrYWJsZShmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gYygibCIsIHJlcChjKHJlcCgiciIsIDIpLCAibCIpLCAzKSksIAogICAgICAgIGNhcHRpb24gPSAiVGFibGUgNC44OiBSZWdyZXNzaW9uIGFuYWx5c2VzIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGFtb25nIFVTIGFkdWx0cyBhbmQgY2hpbGRyZW4gKDQtNXkgb2YgYWdlKSBpbiBTdHVkeSA0LiBUaGUgdGFibGUgcHJlc2VudHMgcmVzdWx0cyBmcm9tIHNlcGFyYXRlIEJheWVzaWFuIHJlZ3Jlc3Npb25zIG9mIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChCT0RZIHZzLiBIRUFSVCwgQk9EWSB2cy4gTUlORCwgYW5kIEhFQVJUIHZzLiBNSU5EKS4gRWFjaCByZWdyZXNzaW9uIGluY2x1ZGVkIHR3byBmaXhlZCBlZmZlY3QgcGFyYW1ldGVyczogKDEpIHRoZSBpbnRlcmNlcHQsIHdoaWNoIEkgdHJlYXQgYXMgYW4gaW5kZXggb2YgdGhlIGFzeW1tZXRyeSBpbiBhdHRyaWJ1dGlvbnMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIGluIHF1ZXN0aW9uOyBhbmQgKDIpIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzLCByZXBvcnRlZCBoZXJlIGFzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByb2JvdCBhbmQgdGhlIGdyYW5kIG1lYW4gKEdNKS4gVGhlIGludGVyY2VwdHMgYXJlIGhpZ2hsaWdodGVkIGluIGJvbGQsIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBwcmltYXJ5IHBhcmFtZXRlcnMgb2YgaW50ZXJlc3QgZm9yIHRoZXNlIGFuYWx5c2VzLiBGb3IgZWFjaCBwYXJhbWV0ZXIsIHRoZSB0YWJsZSBpbmNsdWRlcyB0aGUgZXN0aW1hdGUgKGIpIGFuZCBhIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBmb3IgdGhhdCBlc3RpbWF0ZS4gQXN0ZXJpc2tzIGluZGljYXRlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbHMgdGhhdCBkbyBub3QgaW5jbHVkZSAwLiIpICU+JSAgCiAga2FibGVfc3R5bGluZygpICU+JQogIHJvd19zcGVjKGMoMSwgMywgNSksIGJvbGQgPSBUKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIC0gSEVBUlQiLCAxLCAyKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIC0gTUlORCIsIDMsIDQpICU+JQogIGdyb3VwX3Jvd3MoIkhFQVJUIC0gTUlORCIsIDUsIDYpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLAogICAgICAgICAgICAgICAgICAgICAiQWR1bHRzIiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICJDaGlsZHJlbiwgNC02eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpIiA9IDMpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KdGFibGU0LjgKYGBgCgpgYGB7cn0KdGFibGU0LjkgPC0gcmVndGFiX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmYgJT4lCiAgc2VsZWN0KC1wYWlyLCAtc3R1ZHksIC1jb250YWlucygicy5lLiIpKSAlPiUKICBtdXRhdGUoYiA9IGZvcm1hdChyb3VuZChiLCAyKSwgbnNtYWxsID0gMikpICU+JQogIHJlbmFtZShQYXJhbWV0ZXIgPSBwYXJhbSwKICAgICAgICAgYDk1JSBDSWAgPSBDSTk1KSAlPiUKICByZW5hbWVfYWxsKGZ1bnMoZ3N1Yigibm9uemVybyIsICIgIiwgLikpKSAlPiUKICBrYWJsZShmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gYygibCIsIHJlcChjKHJlcCgiciIsIDIpLCAibCIpLCAzKSksIAogICAgICAgIGNhcHRpb24gPSAiVGFibGUgNC45OiBSZWdyZXNzaW9uIGFuYWx5c2VzIG9mIGRpZmZlcmVuY2VzIGluIGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gVVMgYWR1bHRzIGFuZCBjaGlsZHJlbiAoNC01eSBvZiBhZ2UpIGRpZmZlcmVuY2Ugc2NvcmVzIGluIFN0dWR5IDQuIFRoZSB0YWJsZSBwcmVzZW50cyByZXN1bHRzIGZyb20gc2VwYXJhdGUgQmF5ZXNpYW4gcmVncmVzc2lvbnMgb2YgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKEJPRFkgdnMuIEhFQVJULCBCT0RZIHZzLiBNSU5ELCBhbmQgSEVBUlQgdnMuIE1JTkQpLiBFYWNoIHJlZ3Jlc3Npb24gaW5jbHVkZWQgZm91ciBmaXhlZCBlZmZlY3QgcGFyYW1ldGVyczogKDEpIHRoZSBpbnRlcmNlcHQgKGZvciBhZHVsdHMpLCB3aGljaCBJIHRyZWF0IGFzIGFuIGluZGV4IG9mIHRoZSBhc3ltbWV0cnkgaW4gYXR0cmlidXRpb25zIG9mIHRoZSB0d28gY29uY2VwdHVhbCB1bml0cyBpbiBxdWVzdGlvbiBhbW9uZyBhZHVsdHM7ICgyKSB0aGUgb3ZlcmFsbCBkaWZmZXJlbmNlIGJldHdlZW4gY2hpbGRyZW4gYW5kIGFkdWx0cyAoY29sbGFwc2luZyBhY3Jvc3MgdGFyZ2V0IGNoYXJhY3RlcnMpOyAoMykgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMgKGFtb25nIGFkdWx0cyksIHJlcG9ydGVkIGhlcmUgYXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJvYm90IGFuZCB0aGUgZ3JhbmQgbWVhbiAoR00pOyBhbmQgKDQpIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoaXMgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzIGFuZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGFnZSBncm91cHMuIFRoZSBkZXZlbG9wbWVudGFsIGNvbXBhcmlzb25zIGFyZSBoaWdobGlnaHRlZCBpbiBib2xkLCBiZWNhdXNlIHRoZXNlIGFyZSB0aGUgcHJpbWFyeSBwYXJhbWV0ZXJzIG9mIGludGVyZXN0IGZvciB0aGVzZSBhbmFseXNlcy4gRm9yIGVhY2ggcGFyYW1ldGVyLCB0aGUgdGFibGUgaW5jbHVkZXMgdGhlIGVzdGltYXRlIChiKSBhbmQgYSA5NSUgY3JlZGlibGUgaW50ZXJ2YWwgZm9yIHRoYXQgZXN0aW1hdGUuIEFzdGVyaXNrcyBpbmRpY2F0ZSA5NSUgY3JlZGlibGUgaW50ZXJ2YWxzIHRoYXQgZG8gbm90IGluY2x1ZGUgMC4iKSAlPiUgIAogIGthYmxlX3N0eWxpbmcoKSAlPiUKICByb3dfc3BlYyhzZXEoMiwgMTIsIDIpLCBib2xkID0gVCkgJT4lCiAgZ3JvdXBfcm93cygiQk9EWSAtIEhFQVJUIiwgMSwgNCkgJT4lCiAgZ3JvdXBfcm93cygiQk9EWSAtIE1JTkQiLCA1LCA4KSAlPiUKICBncm91cF9yb3dzKCJIRUFSVCAtIE1JTkQiLCA5LCAxMikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICJEZXZlbG9wbWVudGFsIGNvbXBhcmlzb24iID0gMykpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQp0YWJsZTQuOQpgYGAKCmBgYHtyfQp0YWJsZTQuMTAgPC0gc2NhbGVzX3N0dWR5MiAlPiUgCiAgbXV0YXRlKGNhcGFjaXR5ID0gY2FzZV93aGVuKAogICAgZ3JlcGwoInNhZCIsIGNhcGFjaXR5KSB+ICJmZWVsL2dldCBzYWQiLAogICAgZ3JlcGwoInNjYXJlZCIsIGNhcGFjaXR5KSB+ICJmZWVsL2dldCBzY2FyZWQiLAogICAgZ3JlcGwoImhlYXIiLCBjYXBhY2l0eSkgfiAiaGVhciBbc291bmRzXSIsCiAgICBncmVwbCgic2VlIiwgY2FwYWNpdHkpIH4gInNlZSBbdGhpbmdzXSIsCiAgICBncmVwbCgiaHVuZ3J5IiwgY2FwYWNpdHkpIH4gImdldC9mZWVsIGh1bmdyeSIsCiAgICBncmVwbCgic2ljayIsIGNhcGFjaXR5KSB+ICJnZXQvZmVlbCBzaWNrWy4uLl0iLAogICAgZ3JlcGwoInRob3VnaHRzIiwgY2FwYWNpdHkpIHwgZ3JlcGwoInRoaW5rIiwgY2FwYWNpdHkpIH4gImhhdmUgdGhvdWdodHMvdGhpbmsiLAogICAgZ3JlcGwoImZpZ3VyZSIsIGNhcGFjaXR5KSB+ICJmaWd1cmUgb3V0IGhvdyB0byBkbyB0aGluZ3MvZmlndXJlIHRoaW5ncyBvdXQiLAogICAgZ3JlcGwoImxvdmUiICxjYXBhY2l0eSkgfiAiZmVlbCBsb3ZlL2xvdmUgc29tZW9uZSIsCiAgICBncmVwbCgiZ3VpbHQiLCBjYXBhY2l0eSkgfCBncmVwbCgic29ycnkiLCBjYXBhY2l0eSkgfiAiZmVlbCBndWlsdHkvc29ycnkiLAogICAgVFJVRSB+IGNhcGFjaXR5KSkgJT4lCiAgcmVuYW1lKG9yZGVyX2FkX3MyID0gb3JkZXJfYWQsCiAgICAgICAgIG9yZGVyXzc5X3MyID0gb3JkZXJfNzkpICU+JQogIGZ1bGxfam9pbihzY2FsZXNfc3R1ZHkzICU+JQogICAgICAgICAgICAgIG11dGF0ZShjYXBhY2l0eSA9IGNhc2Vfd2hlbigKICAgICAgICAgICAgICAgIGdyZXBsKCJzYWQiLCBjYXBhY2l0eSkgfiAiZmVlbC9nZXQgc2FkIiwKICAgICAgICAgICAgICAgIGdyZXBsKCJzY2FyZWQiLCBjYXBhY2l0eSkgfiAiZmVlbC9nZXQgc2NhcmVkIiwKICAgICAgICAgICAgICAgIGdyZXBsKCJoZWFyIiwgY2FwYWNpdHkpIH4gImhlYXIgW3NvdW5kc10iLAogICAgICAgICAgICAgICAgZ3JlcGwoInNlZSIsIGNhcGFjaXR5KSB+ICJzZWUgW3RoaW5nc10iLAogICAgICAgICAgICAgICAgZ3JlcGwoImh1bmdyeSIsIGNhcGFjaXR5KSB+ICJnZXQvZmVlbCBodW5ncnkiLAogICAgICAgICAgICAgICAgZ3JlcGwoInNpY2siLCBjYXBhY2l0eSkgfiAiZ2V0L2ZlZWwgc2lja1suLi5dIiwKICAgICAgICAgICAgICAgIGdyZXBsKCJ0aG91Z2h0cyIsIGNhcGFjaXR5KSB8IGdyZXBsKCJ0aGluayIsIGNhcGFjaXR5KSB+ICJoYXZlIHRob3VnaHRzL3RoaW5rIiwKICAgICAgICAgICAgICAgIGdyZXBsKCJmaWd1cmUiLCBjYXBhY2l0eSkgfiAiZmlndXJlIG91dCBob3cgdG8gZG8gdGhpbmdzL2ZpZ3VyZSB0aGluZ3Mgb3V0IiwKICAgICAgICAgICAgICAgIGdyZXBsKCJsb3ZlIiwgY2FwYWNpdHkpIH4gImZlZWwgbG92ZS9sb3ZlIHNvbWVvbmUiLAogICAgICAgICAgICAgICAgZ3JlcGwoImd1aWx0IiwgY2FwYWNpdHkpIHwgZ3JlcGwoInNvcnJ5IiwgY2FwYWNpdHkpIH4gImZlZWwgZ3VpbHR5L3NvcnJ5IiwKICAgICAgICAgICAgICAgIFRSVUUgfiBjYXBhY2l0eSkpICU+JQogICAgICAgICAgICAgIHJlbmFtZShvcmRlcl9hZF9zMyA9IG9yZGVyX2FkLAogICAgICAgICAgICAgICAgICAgICBvcmRlcl83OV9zMyA9IG9yZGVyXzc5KSkgJT4lCiAgZnVsbF9qb2luKHNjYWxlc19zdHVkeTQgJT4lCiAgICAgICAgICAgICAgbXV0YXRlKGNhcGFjaXR5ID0gY2FzZV93aGVuKAogICAgICAgICAgICAgICAgZ3JlcGwoInNhZCIsIGNhcGFjaXR5KSB+ICJmZWVsL2dldCBzYWQiLAogICAgICAgICAgICAgICAgZ3JlcGwoInNjYXJlZCIsIGNhcGFjaXR5KSB+ICJmZWVsL2dldCBzY2FyZWQiLAogICAgICAgICAgICAgICAgZ3JlcGwoImhlYXIiLCBjYXBhY2l0eSkgfiAiaGVhciBbc291bmRzXSIsCiAgICAgICAgICAgICAgICBncmVwbCgic2VlIiwgY2FwYWNpdHkpIH4gInNlZSBbdGhpbmdzXSIsCiAgICAgICAgICAgICAgICBncmVwbCgiaHVuZ3J5IiwgY2FwYWNpdHkpIH4gImdldC9mZWVsIGh1bmdyeSIsCiAgICAgICAgICAgICAgICBncmVwbCgic2ljayIsIGNhcGFjaXR5KSB+ICJnZXQvZmVlbCBzaWNrWy4uLl0iLAogICAgICAgICAgICAgICAgZ3JlcGwoInRob3VnaHRzIiwgY2FwYWNpdHkpIHwgZ3JlcGwoInRoaW5rIiwgY2FwYWNpdHkpIH4gImhhdmUgdGhvdWdodHMvdGhpbmsiLAogICAgICAgICAgICAgICAgZ3JlcGwoImZpZ3VyZSIsIGNhcGFjaXR5KSB+ICJmaWd1cmUgb3V0IGhvdyB0byBkbyB0aGluZ3MvZmlndXJlIHRoaW5ncyBvdXQiLAogICAgICAgICAgICAgICAgZ3JlcGwoImxvdmUiLCBjYXBhY2l0eSkgfiAiZmVlbCBsb3ZlL2xvdmUgc29tZW9uZSIsCiAgICAgICAgICAgICAgICBncmVwbCgiZ3VpbHQiLCBjYXBhY2l0eSkgfCBncmVwbCgic29ycnkiLCBjYXBhY2l0eSkgfiAiZmVlbCBndWlsdHkvc29ycnkiLAogICAgICAgICAgICAgICAgVFJVRSB+IGNhcGFjaXR5KSkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lKG9yZGVyX2FkX3M0ID0gb3JkZXJfYWQpKSAlPiUKICBtdXRhdGUodXJfZmFjdG9yID0gY2FzZV93aGVuKAogICAgIWlzLm5hKGBBZHVsdHNgKSB+IGBBZHVsdHNgLAogICAgIWlzLm5hKGBDaGlsZHJlbiwgNy05eWApIH4gYENoaWxkcmVuLCA3LTl5YCwKICAgICFpcy5uYShgU3R1ZHkgMzogQWR1bHRzYCkgfiBgU3R1ZHkgMzogQWR1bHRzYCwKICAgICFpcy5uYShgU3R1ZHkgMzogQ2hpbGRyZW4sIDctOXlgKSB+IGBTdHVkeSAzOiBDaGlsZHJlbiwgNy05eWAsCiAgICAhaXMubmEoYFN0dWR5IDQ6IEFkdWx0c2ApIH4gYFN0dWR5IDQ6IEFkdWx0c2AsCiAgICBUUlVFIH4gTkFfaW50ZWdlcl8pKSAlPiUKICBtdXRhdGUodXJfZmFjdG9yID0gZmFjdG9yKHVyX2ZhY3RvciwgbGV2ZWxzID0gYygiQk9EWSIsICJIRUFSVCIsICJNSU5EIikpKSAlPiUKICBhcnJhbmdlKHVyX2ZhY3Rvciwgb3JkZXJfYWRfczIsIG9yZGVyXzc5X3MyLCBvcmRlcl9hZF9zMywgb3JkZXJfYWRfczQpICU+JQogIHNlbGVjdCgtdXJfZmFjdG9yLCAtc3RhcnRzX3dpdGgoIm9yZGVyIikpICU+JQogIG11dGF0ZV9hdCh2YXJzKC1jYXBhY2l0eSksCiAgICAgICAgICAgIGZ1bnMoaWZlbHNlKGlzLm5hKC4pLCAiIiwgIuKckyIpKSkgJT4lCiAgcmVuYW1lKENhcGFjaXR5ID0gY2FwYWNpdHksCiAgICAgICAgIGBBZHVsdHNgID0gYFN0dWR5IDM6IEFkdWx0c2AsCiAgICAgICAgIGBDaGlsZHJlbiwgNy05eWAgPSBgU3R1ZHkgMzogQ2hpbGRyZW4sIDctOXlgLAogICAgICAgICBgQWR1bHRzYCA9IGBTdHVkeSA0OiBBZHVsdHNgKSAlPiUKICBrYWJsZShmb3JtYXQgPSAiaHRtbCIsCiAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSA0LjEwOiBTY2FsZXMgZm9yIGVhY2ggb2YgdGhlIGNvbmNlcHR1YWwgdW5pdHMgKGZhY3RvcnMpIGlkZW50aWZpZWQgYnkgRUZBIGZvciBVUyBBZHVsdHMgaW4gU3R1ZGllcyAyLTQgYW5kIGZvciA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIGluIFN0dWRpZXMgMiBhbmQgMy4gKFNlZSBBcHBlbmRpeCBCIGZvciBhbHRlcm5hdGl2ZSBzY2FsZXMgYmFzZWQgb24geW91bmdlciBjaGlsZHJlbidzIEVGQSByZXN1bHRzLCBmb3IgU3R1ZGllcyAzIGFuZCA0LikgQSBjaGVja21hcmsgaW5kaWNhdGVzIHRoYXQgYSBtZW50YWwgY2FwYWNpdHkgd2FzIGluY2x1ZGVkIGluIGEgc2NhbGUgZm9yIGEgcGFydGljdWxhciBzYW1wbGUuIikgJT4lCiAga2FibGVfc3R5bGluZygpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLAogICAgICAgICAgICAgICAgICAgICAiU3R1ZHkgMiIgPSAyLAogICAgICAgICAgICAgICAgICAgICAiU3R1ZHkgMyIgPSAyLAogICAgICAgICAgICAgICAgICAgICAiU3R1ZHkgNCIgPSAxKSkgJT4lCiAgZ3JvdXBfcm93cygiQk9EWSBzY2FsZSIsIDEsIDkpICU+JQogIGdyb3VwX3Jvd3MoIkhFQVJUIHNjYWxlIiwgMTAsIDE5KSAlPiUKICBncm91cF9yb3dzKCJNSU5EIHNjYWxlIiwgMjAsIDMxKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KdGFibGU0LjEwCmBgYAoKCiMgR2VuZXJhbCBkaXNjdXNzaW9uCgpJbiB0aGlzIGNoYXB0ZXIsIEkgZm9jdXNlZCBvbiBhIHNlY29uZCBhc3BlY3Qgb2YgdGhlIGRldmVsb3BtZW50IG9mIGNvbmNlcHR1YWwgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlOiB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgImNvbmNlcHR1YWwgdW5pdHMiIGlkZW50aWZpZWQgYW1vbmcgVVMgYWR1bHRzIGluIHRoZSBwcmV2aW91cyBjaGFwdGVyOiBCT0RZLCBIRUFSVCwgYW5kIE1JTkQuIEkgZm9jdXNlZCBpbiBwYXJ0aWN1bGFyIHdoZXRoZXIgdGhlIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgZG9jdW1lbnRlZCBieSB0aGUgc3R1ZGllcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3NlcnRhdGlvbiBicmluZyB0byBsaWdodCBwb3NzaWJsZSBfaGllcmFyY2hpY2FsIHJlbGF0aW9uc18gYW1vbmcgQk9EWSwgSEVBUlQsIGFuZCBNSU5EOiBEbyB0aGVzZSBzdHVkaWVzIHByb3ZpZGUgYW55IGV2aWRlbmNlIGFib3V0IHdoaWNoIG9mIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMgbWlnaHQgYmUgbW9yZSAiYmFzaWMiIHZzLiBtb3JlIGNvbXBsZXgsIG9yIHdoZXRoZXIgYW55IG9mIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMgbWlnaHQgYmUgY29uc2lkZXJlZCB0byBkZXBlbmQgb24gdGhlIHByZXNlbmNlIG9mIG90aGVycz8gSG93IG1pZ2h0IHRoaXMgY29uY2VwdHVhbCBvcmdhbml6YXRpb24gY2hhbmdlIG92ZXIgZGV2ZWxvcG1lbnQ/CgpgYGB7cn0KIyBkYXRhZnJhbWUgZm9yIGFubm90YXRpbmcgc3VtbWFyeSBwbG90cwpkZl9hbm5vdCA8LSBkYXRhLmZyYW1lKHBhaXIgPSBsZXZlbHMoZmFjdG9yKGQxYV9hZF9zY29yZWRfYWRfZGlmZiRwYWlyKSksCiAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gYygiQk9EWSB3aXRob3V0IEhFQVJUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCT0RZIHdpdGhvdXQgTUlORCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSEVBUlQgd2l0aG91dCBNSU5EIiksCiAgICAgICAgICAgICAgICAgICAgICAgbmVnID0gYygiSEVBUlQgd2l0aG91dCBCT0RZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNSU5EIHdpdGhvdXQgQk9EWSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUlORCB3aXRob3V0IEhFQVJUIikpCmBgYAoKYGBge3J9CiMgY29tYmluZSBhbGwgZGlmZmVyZW5jZSBzY29yZXMgYWNyb3NzIHN0dWRpZXMKZGlmZnNjb3Jlc19hbGwgPC0gYmluZF9yb3dzKGQxYV9hZF9zY29yZWRfYWRfZGlmZiwgZDFiX2FkX3Njb3JlZF9hZF9kaWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZDFjX2FkX3Njb3JlZF9hZF9kaWZmLCBkMWRfYWRfc2NvcmVkX2FkX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMl9hZF9zY29yZWRfYWRfZGlmZiwgZDJfNzlfc2NvcmVkX2FkX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkM19hZF9zY29yZWRfYWRfZGlmZiwgZDNfNzlfc2NvcmVkX2FkX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkM180Nl9zY29yZWRfYWRfZGlmZiwgZDRfYWRfc2NvcmVkX2FkX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkNF80Nl9zY29yZWRfYWRfZGlmZikgJT4lCiAgbXV0YXRlKHN0dWR5ID0gZ3N1YigiOi4qJCIsICIiLCBzdHVkeSksCiAgICAgICAgIGFnZV9ncm91cCA9IGZhY3RvcihhZ2VfZ3JvdXAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiYWR1bHRzIiwgImNoaWxkcmVuNzkiLCAiY2hpbGRyZW40NiIpKSwKICAgICAgICAgZGVzaWduID0gY2FzZV93aGVuKAogICAgICAgICAgIHN0dWR5ICVpbiUgYygiU3R1ZHkgMWEiLCAiU3R1ZHkgMWIiLCAiU3R1ZHkgMiIpIH4gCiAgICAgICAgICAgICAiZWRnZSBjYXNlIChiZXR3ZWVuLVNzKSIsCiAgICAgICAgICAgc3R1ZHkgJWluJSBjKCJTdHVkeSAxYyIsICJTdHVkeSA0IikgfiAKICAgICAgICAgICAgICJlZGdlIGNhc2UgKHdpdGhpbi1TcykiLAogICAgICAgICAgIHN0dWR5ICVpbiUgYygiU3R1ZHkgMWQiLCAiU3R1ZHkgMyIpIH4gCiAgICAgICAgICAgICAiZGl2ZXJzZSBjaGFyYWN0ZXJzIChiZXR3ZWVuLVNzKSIpLAogICAgICAgICBkZXNpZ24gPSBmYWN0b3IoZGVzaWduLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImVkZ2UgY2FzZSAoYmV0d2Vlbi1TcykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWRnZSBjYXNlICh3aXRoaW4tU3MpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpdmVyc2UgY2hhcmFjdGVycyAoYmV0d2Vlbi1TcykiKSkpCgojIGdldCBtZWFuIGRpZmZlcmVuY2Ugc2NvcmVzIGJ5IHN0dWR5LCBzYW1wbGUKZGlmZnNjb3Jlc19hbGxfbWVhbnMgPC0gZGlmZnNjb3Jlc19hbGwgJT4lIAogIGdyb3VwX2J5KHN0dWR5LCBkZXNpZ24sIGFnZV9ncm91cCwgcGFpcikgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZChjb2wgPSAiZGlmZiIpICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKG5vbnplcm8gPSBpZmVsc2UoY2lfbG93ZXIgKiBjaV91cHBlciA+IDAsICIqIiwgIiIpLAogICAgICAgICBzdGFyX3BvcyA9IGlmZWxzZShtZWFuID4gMCwgY2lfdXBwZXIgKyAwLjA1LCBjaV9sb3dlciAtIDAuMDUpLAogICAgICAgICBzdGFyX3ZqdXN0ID0gaWZlbHNlKG1lYW4gPiAwLCAwLjUsIDEpKQpgYGAKCmBgYHtyfQpwbG90X2RpZmZzY29yZXNfYWxsIDwtIGdncGxvdChkaWZmc2NvcmVzX2FsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSAgYWdlX2dyb3VwLCB5ID0gZGlmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gc3R1ZHksIGNvbG9yID0gc3R1ZHkpKSArCiAgZmFjZXRfZ3JpZCh+IHBhaXIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMDUsIAogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZShqaXR0ZXIud2lkdGggPSAwLjEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2RnZS53aWR0aCA9IDAuOSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppdHRlci5oZWlnaHQgPSAwKSkgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gZGlmZnNjb3Jlc19hbGxfbWVhbnMsCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIsCiAgICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IGRlc2lnbiksCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmF0dGVuID0gMi41LAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSkgKwogIGdlb21fdGV4dChkYXRhID0gZGlmZnNjb3Jlc19hbGxfbWVhbnMsCiAgICAgICAgICAgIGFlcyhsYWJlbCA9IG5vbnplcm8sIHkgPSBzdGFyX3Bvcywgdmp1c3QgPSBzdGFyX3ZqdXN0KSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdGV4dChkYXRhID0gZGZfYW5ub3QsIHNob3cubGVnZW5kID0gRiwKICAgICAgICAgICAgYWVzKHggPSBOVUxMLCB5ID0gTlVMTCwgZ3JvdXAgPSBOVUxMLCBjb2xvciA9IE5VTEwsIHNoYXBlID0gTlVMTCwKICAgICAgICAgICAgICAgIGxhYmVsID0gcG9zKSwgeCA9IDIsIHkgPSAxLCBoanVzdCA9IDAuNSwgdmp1c3QgPSAxLCBzaXplID0gMykgKwogIGdlb21fdGV4dChkYXRhID0gZGZfYW5ub3QsIHNob3cubGVnZW5kID0gRiwKICAgICAgICAgICAgYWVzKHggPSBOVUxMLCB5ID0gTlVMTCwgZ3JvdXAgPSBOVUxMLCBjb2xvciA9IE5VTEwsIHNoYXBlID0gTlVMTCwKICAgICAgICAgICAgICAgIGxhYmVsID0gbmVnKSwgeCA9IDIsIHkgPSAtMSwgaGp1c3QgPSAwLjUsIHZqdXN0ID0gMCwgc2l6ZSA9IDMpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIoIlN0dWR5IiwgcGFsZXR0ZSA9ICJEYXJrMiIsIGRpcmVjdGlvbiA9IC0xLAogICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZChwb3NpdGlvbiA9ICJob3Jpem9udGFsIiwgbmNvbCA9IDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSkpICsKICBzY2FsZV9zaGFwZV9tYW51YWwoIlZhcmlhbnQgb2YgZXhwZXJpbWVudGFsIGFwcHJvYWNoIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygxNiwgMTUsIDE3KSwKICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgbmNvbCA9IDMpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZSgiQWdlIGdyb3VwIiwgYnJlYWtzID0gYygiYWR1bHRzIiwgImNoaWxkcmVuNzkiLCAiY2hpbGRyZW40NiIpLAogICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQWR1bHRzIiwgIkNoaWxkcmVuLCA3LTl5IiwgIkNoaWxkcmVuLCA0LTZ5IikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoIkRpZmZlcmVuY2Ugc2NvcmUiLCBicmVha3MgPSBzZXEoLTEsIDEsIDAuMikpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmJveCA9ICJ2ZXJ0aWNhbCIsCiAgICAgICAgbGVnZW5kLnNwYWNpbmcgPSB1bml0KDAsICJsaW5lcyIpKQpgYGAKCmBgYHtyfQojIGNvbWJpbmUgYWxsIGFkdWx0IHJlZ3Jlc3Npb25zCnJlZ3RhYnNfYWxsX2FkIDwtIGJpbmRfcm93cyhyZWd0YWJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndGFiX2QxYl9hZF9zY29yZWRfYWRfZGlmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3RhYl9kMWNfYWRfc2NvcmVkX2FkX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWd0YWJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndGFiX2QyX2FkX3Njb3JlZF9hZF9kaWZmICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgMiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndGFiX2QzX2FkX3Njb3JlZF9hZF9kaWZmICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgMyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndGFiX2Q0X2FkX3Njb3JlZF9hZF9kaWZmICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgNCIpKSAlPiUKICBtdXRhdGUoYWdlX2dyb3VwID0gIkFkdWx0cyIpCgojIGNvbWJpbmUgYWxsIG9sZGVyIGNoaWxkcmVuIHJlZ3Jlc3Npb25zCnJlZ3RhYnNfYWxsXzc5IDwtIGJpbmRfcm93cyhyZWd0YWJfZDJfNzlfc2NvcmVkX2FkX2RpZmYgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJTdHVkeSAyIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWd0YWJfZDNfNzlfc2NvcmVkX2FkX2RpZmYgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJTdHVkeSAzIikpICU+JQogIG11dGF0ZShhZ2VfZ3JvdXAgPSAiQ2hpbGRyZW4sIDctOXkiKQoKIyBjb21iaW5lIGFsbCB5b3VuZ2VyIGNoaWxkcmVuIHJlZ3Jlc3Npb25zCnJlZ3RhYnNfYWxsXzQ2IDwtIGJpbmRfcm93cyhyZWd0YWJfZDNfNDZfc2NvcmVkX2FkX2RpZmYgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJTdHVkeSAzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWd0YWJfZDRfNDZfc2NvcmVkX2FkX2RpZmYgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJTdHVkeSA0IikpICU+JQogIG11dGF0ZShhZ2VfZ3JvdXAgPSAiQ2hpbGRyZW4sIDQtNnkiKQoKIyBjb21iaW5lIGFsbCByZWdyZXNzaW9ucyBmb3IgYWxsIHN0dWRpZXMsIHNhbXBsZXMKcmVndGFic19hbGwgPC0gYmluZF9yb3dzKHJlZ3RhYnNfYWxsX2FkLCByZWd0YWJzX2FsbF83OSwgcmVndGFic19hbGxfNDYpICU+JQogIG11dGF0ZShDSTk1ID0gZ3N1YigiXFxbIiwgIiIsIENJOTUpLCAKICAgICAgICAgQ0k5NSA9IGdzdWIoIlxcXSIsICIiLCBDSTk1KSkgJT4lCiAgc2VwYXJhdGUoQ0k5NSwgYygiY2lfbG93ZXIiLCAiY2lfdXBwZXIiKSwgCiAgICAgICAgICAgc2VwID0gIiwgIiwgcmVtb3ZlID0gRiwgY29udmVydCA9IFQpICU+JQogIG11dGF0ZShhZ2VfZ3JvdXAgPSBmYWN0b3IoYWdlX2dyb3VwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkFkdWx0cyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbGRyZW4sIDctOXkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaWxkcmVuLCA0LTZ5IikpLAogICAgICAgICBkZXNpZ24gPSBjYXNlX3doZW4oCiAgICAgICAgICAgc3R1ZHkgJWluJSBjKCJTdHVkeSAxYSIsICJTdHVkeSAxYiIsICJTdHVkeSAyIikgfiAKICAgICAgICAgICAgICJlZGdlIGNhc2UgKGJldHdlZW4tU3MpIiwKICAgICAgICAgICBzdHVkeSAlaW4lIGMoIlN0dWR5IDFjIiwgIlN0dWR5IDQiKSB+IAogICAgICAgICAgICAgImVkZ2UgY2FzZSAod2l0aGluLVNzKSIsCiAgICAgICAgICAgc3R1ZHkgJWluJSBjKCJTdHVkeSAxZCIsICJTdHVkeSAzIikgfiAKICAgICAgICAgICAgICJkaXZlcnNlIGNoYXJhY3RlcnMgKGJldHdlZW4tU3MpIiksCiAgICAgICAgIGRlc2lnbiA9IGZhY3RvcihkZXNpZ24sIAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiZWRnZSBjYXNlIChiZXR3ZWVuLVNzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlZGdlIGNhc2UgKHdpdGhpbi1TcykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGl2ZXJzZSBjaGFyYWN0ZXJzIChiZXR3ZWVuLVNzKSIpKSkKYGBgCgpgYGB7cn0KcGxvdF9yZWd0YWJzX2FsbCA8LSBnZ3Bsb3QocmVndGFic19hbGwgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHBhcmFtID09ICJJbnRlcmNlcHQiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3Rhcl9wb3MgPSBpZmVsc2UoYiA+IDAsIGNpX3VwcGVyICsgMC4wNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lfbG93ZXIgLSAwLjA1KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rhcl92anVzdCA9IGlmZWxzZShiID4gMCwgMC41LCAxKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gYWdlX2dyb3VwLCB5ID0gYiwgZ3JvdXAgPSBzdHVkeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gc3R1ZHksIHNoYXBlID0gZGVzaWduKSkgKwogIGZhY2V0X2dyaWQofiBwYWlyKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMikgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwgc2hvdy5sZWdlbmQgPSBGLAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksIHdpZHRoID0gMCkgKwogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksIHNpemUgPSAyKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG5vbnplcm8sIHkgPSBzdGFyX3Bvcywgdmp1c3QgPSBzdGFyX3ZqdXN0KSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdGV4dChkYXRhID0gZGZfYW5ub3QsIHNob3cubGVnZW5kID0gRiwKICAgICAgICAgICAgYWVzKHggPSBOVUxMLCB5ID0gTlVMTCwgZ3JvdXAgPSBOVUxMLCBjb2xvciA9IE5VTEwsIHNoYXBlID0gTlVMTCwKICAgICAgICAgICAgICAgIGxhYmVsID0gcG9zKSwgeCA9IDIsIHkgPSAwLjQsIGhqdXN0ID0gMC41LCB2anVzdCA9IDEsIHNpemUgPSAzKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBkZl9hbm5vdCwgc2hvdy5sZWdlbmQgPSBGLAogICAgICAgICAgICBhZXMoeCA9IE5VTEwsIHkgPSBOVUxMLCBncm91cCA9IE5VTEwsIGNvbG9yID0gTlVMTCwgc2hhcGUgPSBOVUxMLAogICAgICAgICAgICAgICAgbGFiZWwgPSBuZWcpLCB4ID0gMiwgeSA9IC0wLjcsIGhqdXN0ID0gMC41LCB2anVzdCA9IDAsIHNpemUgPSAzKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKCJTdHVkeSIsIHBhbGV0dGUgPSAiRGFyazIiLCBkaXJlY3Rpb24gPSAtMSwKICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQocG9zaXRpb24gPSAiaG9yaXpvbnRhbCIsIG5jb2wgPSA3KSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCgiVmFyaWFudCBvZiBleHBlcmltZW50YWwgYXBwcm9hY2giLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKDE2LCAxNSwgMTcpLAogICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLCBuY29sID0gMykpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoIlBhcmFtZXRlciBlc3RpbWF0ZSAoYikiLCAKICAgICAgICAgICAgICAgICAgICAgIyBsaW1pdHMgPSBjKC0wLjc0LCAwLjc0KSwgCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgtMSwgMSwgMC4yKSkgKwogIGxhYnMoeCA9ICJBZ2UgZ3JvdXAiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5ib3ggPSAidmVydGljYWwiLAogICAgICAgIGxlZ2VuZC5zcGFjaW5nID0gdW5pdCgwLCAibGluZXMiKSkKYGBgCgpgYGB7cn0Kc2NvcmVfY29yZXNfYWxsIDwtIGJpbmRfcm93cyhzY29yZV9jb3JfZnVuKGQxYV9hZF9zY29yZWRfYWQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHN0dWR5ID0gIlN0dWR5IDFhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VfZ3JvdXAgPSAiYWR1bHRzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmVfY29yX2Z1bihkMWJfYWRfc2NvcmVkX2FkKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJTdHVkeSAxYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX2dyb3VwID0gImFkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlX2Nvcl9mdW4oZDFjX2FkX3Njb3JlZF9hZCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgMWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZV9ncm91cCA9ICJhZHVsdHMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZV9jb3JfZnVuKGQxZF9hZF9zY29yZWRfYWQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHN0dWR5ID0gIlN0dWR5IDFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VfZ3JvdXAgPSAiYWR1bHRzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmVfY29yX2Z1bihkMl9hZF9zY29yZWRfYWQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHN0dWR5ID0gIlN0dWR5IDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZV9ncm91cCA9ICJhZHVsdHMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZV9jb3JfZnVuKGQyXzc5X3Njb3JlZF9hZCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX2dyb3VwID0gImNoaWxkcmVuNzkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZV9jb3JfZnVuKGQzX2FkX3Njb3JlZF9hZCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlX2dyb3VwID0gImFkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlX2Nvcl9mdW4oZDNfNzlfc2NvcmVkX2FkKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJTdHVkeSAzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VfZ3JvdXAgPSAiY2hpbGRyZW43OSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlX2Nvcl9mdW4oZDNfNDZfc2NvcmVkX2FkKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJTdHVkeSAzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VfZ3JvdXAgPSAiY2hpbGRyZW40NiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlX2Nvcl9mdW4oZDRfYWRfc2NvcmVkX2FkKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShzdHVkeSA9ICJTdHVkeSA0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VfZ3JvdXAgPSAiYWR1bHRzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmVfY29yX2Z1bihkNF80Nl9zY29yZWRfYWQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHN0dWR5ID0gIlN0dWR5IDQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZV9ncm91cCA9ICJjaGlsZHJlbjQ2IikpICU+JQogIG11dGF0ZShub256ZXJvID0gaWZlbHNlKGNpX2xvd2VyICAqIGNpX3VwcGVyID4gMCwgIioiLCAiIiksCiAgICAgICAgIGFnZV9ncm91cCA9IGZhY3RvcihhZ2VfZ3JvdXAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiYWR1bHRzIiwgImNoaWxkcmVuNzkiLCAiY2hpbGRyZW40NiIpKSwKICAgICAgICAgZGVzaWduID0gY2FzZV93aGVuKAogICAgICAgICAgIHN0dWR5ICVpbiUgYygiU3R1ZHkgMWEiLCAiU3R1ZHkgMWIiLCAiU3R1ZHkgMiIpIH4gCiAgICAgICAgICAgICAiZWRnZSBjYXNlIChiZXR3ZWVuLVNzKSIsCiAgICAgICAgICAgc3R1ZHkgJWluJSBjKCJTdHVkeSAxYyIsICJTdHVkeSA0IikgfiAKICAgICAgICAgICAgICJlZGdlIGNhc2UgKHdpdGhpbi1TcykiLAogICAgICAgICAgIHN0dWR5ICVpbiUgYygiU3R1ZHkgMWQiLCAiU3R1ZHkgMyIpIH4gCiAgICAgICAgICAgICAiZGl2ZXJzZSBjaGFyYWN0ZXJzIChiZXR3ZWVuLVNzKSIpLAogICAgICAgICBkZXNpZ24gPSBmYWN0b3IoZGVzaWduLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImVkZ2UgY2FzZSAoYmV0d2Vlbi1TcykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWRnZSBjYXNlICh3aXRoaW4tU3MpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpdmVyc2UgY2hhcmFjdGVycyAoYmV0d2Vlbi1TcykiKSkpICU+JQogIGFycmFuZ2UocGFpciwgYWdlX2dyb3VwLCBzdHVkeSkKYGBgCgpgYGB7cn0KcGxvdF9zY29yZV9jb3Jlc19hbGwgPC0gc2NvcmVfY29yZXNfYWxsICU+JQogIG11dGF0ZShzdGFyX3BvcyA9IGlmZWxzZShyID4gMCwgY2lfdXBwZXIgKyAwLjA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjaV9sb3dlciAtIDAuMDUpLAogICAgICAgICBzdGFyX3ZqdXN0ID0gaWZlbHNlKHIgPiAwLCAwLjUsIDEpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhZ2VfZ3JvdXAsIHkgPSByLCBncm91cCA9IHN0dWR5LAogICAgICAgICAgICAgY29sb3IgPSBzdHVkeSwgc2hhcGUgPSBkZXNpZ24pKSArCiAgZmFjZXRfZ3JpZCh+IHBhaXIpICsKICBhbm5vdGF0ZSgicmVjdCIsIGZpbGwgPSAiZ3JheSIsIGFscGhhID0gMC4yLAogICAgICAgICAgIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gc3FydCguMSksIHltYXggPSBzcXJ0KC41KSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksIHdpZHRoID0gMCwKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLCBzaG93LmxlZ2VuZCA9IEYpICsgCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwgc2l6ZSA9IDIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbm9uemVybywgeSA9IHN0YXJfcG9zLCB2anVzdCA9IHN0YXJfdmp1c3QpLAogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKCJTdHVkeSIsIHBhbGV0dGUgPSAiRGFyazIiLCBkaXJlY3Rpb24gPSAtMSwKICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQocG9zaXRpb24gPSAiaG9yaXpvbnRhbCIsIG5jb2wgPSA3KSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCgiVmFyaWFudCBvZiBleHBlcmltZW50YWwgYXBwcm9hY2giLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKDE2LCAxNSwgMTcpLAogICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLCBuY29sID0gMykpICsKICBzY2FsZV94X2Rpc2NyZXRlKCJBZ2UgZ3JvdXAiLCAKICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFkdWx0cyIsICJDaGlsZHJlbiwgNy05eSIsICJDaGlsZHJlbiwgNC02eSIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJDb3JyZWxhdGlvbiBiZXR3ZWVuIHNjb3JlcyAoUGVhcnNvbidzIHIpIiwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoTkEsIDEpLAogICAgICAgICAgICAgICAgICAgICAjIGxpbWl0cyA9IGMoLTEsIDEpLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKC0xLCAxLCAwLjI1KSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuYm94ID0gInZlcnRpY2FsIiwKICAgICAgICBsZWdlbmQuc3BhY2luZyA9IHVuaXQoMCwgImxpbmVzIikpCmBgYAoKYGBge3J9CmZpZ3VyZTQuMTAgPC0gcGxvdF9ncmlkKHBsb3RfZGlmZnNjb3Jlc19hbGwgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgcGxvdF9yZWd0YWJzX2FsbCArIAogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgIHBsb3Rfc2NvcmVfY29yZXNfYWxsICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2xlZ2VuZChwbG90X3JlZ3RhYnNfYWxsKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAxLCAxLCAwLjIpLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBIiwgIkIiLCAiQyIsICIiKSkKYGBgCgpgYGB7cn0KZmlndXJlNC4xMF9jYXAgPC0gYWRkX3N1YihmaWd1cmU0LjEwLCBzdHJfd3JhcCgiRmlndXJlIDQuMTA6IFN1bW1hcmllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGF0dHJpYnV0aW9ucyBvZiBCT0RZLCBIRUFSVCwgYW5kIE1JTkQgZm9yIGFsbCBzdHVkaWVzLiAoQSkgRGlmZmVyZW5jZSBzY29yZXMgZm9yIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChpZ25vcmluZyB0YXJnZXQgY2hhcmFjdGVycykuIFBvc2l0aXZlIGRpZmZlcmVuY2Ugc2NvcmVzIGNvcnJlc3BvbmQgdG8gcGFydGljaXBhbnRzIHdobyBhdHRyaWJ1dGVkIHRoZSBmaXJzdCBjb25jZXB0dWFsIHVuaXQgbW9yZSBzdHJvbmdseSB0aGFuIHRoZSBzZWNvbmQ7IG5lZ2F0aXZlIGRpZmZlcmVuY2Ugc2NvcmVzIGNvcnJlc3BvbmQgdG8gcGFydGljaXBhbnRzIHdobyBhdHRyaWJ1dGVkIHRoZSBzZWNvbmQgY29uY2VwdHVhbCB1bml0IG1vcmUgc3Ryb25nbHkgdGhhbiB0aGUgZmlyc3QuIChCKSBJbnRlcmNlcHRzIGZyb20gaW5kZXBlbmRlbnQgQmF5ZXNpYW4gcmVncmVzc2lvbiBhbmFseXNlcyBmb3IgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgYW5kIGVhY2ggc2FtcGxlIG9mIHBhcnRpY2lwYW50cywgYWNjb3VudGluZyBmb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyBhbmQgaW5jbHVkaW5nIHJhbmRvbSBpbnRlcmNlcHRzIGZvciBwYXJ0aWNwaXBhbnRzIHdoZW4gYXBwcm9wcmlhdGUgKFN0dWRpZXMgMWQgYW5kIDIpLiBQb3NpdGl2ZSBpbnRlcmNlcHRzIGluZGljYXRlIHNhbXBsZXMgaW4gd2hpY2ggcGFydGljaXBhbnRzIHRlbmRlZCB0byBhdHRyaWJ1dGUgdGhlIGZpcnN0IGNvbmNlcHR1YWwgdW5pdCBtb3JlIHN0cm9uZ2x5IHRoYW4gdGhlIHNlY29uZDsgbmVnYXRpdmUgaW50ZXJjZXB0cyBpbmRpY2F0ZSBzYW1wbGVzIGluIHdoaWNoIHBhcnRpY2lwYW50cyB0ZW5kZWQgdG8gYXR0cmlidXRlIHRoZSBzZWNvbmQgY29uY2VwdHVhbCB1bml0IG1vcmUgc3Ryb25nbHkgdGhhbiB0aGUgZmlyc3QuIChDKSBQZWFyc29uIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHNjb3JlcyBvbiBlYWNoIG9mIHRoZSBzY2FsZXMgKHRoZW9yZXRpY2FsIHJhbmdlOiAtMSB0byArMSkuIFBvc2l0aXZlIGNvcnJlbGF0aW9ucyBpbmRpY2F0ZSB0aGF0IGhpZ2hlciBzY29yZXMgaW4gb25lIHNjYWxlIHdlcmUgYXNzb2NpYXRlZCB3aXRoIGhpZ2hlciBzY29yZXMgaW4gdGhlIG90aGVyIHNjYWxlLiBUbyBhc3Npc3QgdGhlIHJlYWRlciBpbiBhc3Nlc3NpbmcgZWZmZWN0IHNpemUsIHRoZSBzaGFkZWQgYXJlYSBoaWdobGlnaHRzIHZhbHVlcyBvZiByIHRoYXQgY29ycmVzcG9uZCB0byBzY29yZXMgaW4gb25lIHNjYWxlIGFjY291bnRpbmcgZm9yIGJldHdlZW4gMTAtNTAlIG9mIHRoZSB2YXJpYW5jZSBvZiBzY29yZXMgaW4gdGhlIG90aGVyIHNjYWxlLiBGb3IgYWxsIHBhbmVscywgZXJyb3IgYmFycyBhcmUgOTUlIENJcyBhbmQgYXN0ZXJpc2tzIGluZGljYXRlIENJcyB0aGF0IGRvIG5vdCBpbmNsdWRlIHplcm8uIiwgMTE1KSwgeCA9IDAsIGhqdXN0ID0gMCkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxLjR9CmdnZHJhdyhmaWd1cmU0LjEwX2NhcCkKYGBgCgpgYGB7cn0KZGlmZnNjb3Jlc190YWIgPC0gZGlmZnNjb3Jlc19hbGwgJT4lIAogIG11dGF0ZShkaWZmX3NpZ24gPSBjYXNlX3doZW4oZGlmZiA+IDAgfiAicG9zaXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiA9PSAwIH4gInplcm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiA8IDAgfiAibmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pKSAlPiUKICBjb3VudChwYWlyLCBhZ2VfZ3JvdXAsIHN0dWR5LCBkaWZmX3NpZ24pICU+JQogIGdyb3VwX2J5KHBhaXIsIGFnZV9ncm91cCwgc3R1ZHkpICU+JQogIG11dGF0ZShwcm9wID0gbi9zdW0obikpICU+JQogIHNlbGVjdCgtbikgJT4lCiAgdW5ncm91cCgpICU+JQogIHNwcmVhZChkaWZmX3NpZ24sIHByb3ApICU+JQogIG11dGF0ZShtb2RhbCA9IGNhc2Vfd2hlbihwYWlyID09ICJCT0RZIC0gSEVBUlQiIH4gcG9zaXRpdmUgKyB6ZXJvLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlyID09ICJCT0RZIC0gTUlORCIgfiBuZWdhdGl2ZSArIHplcm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaXIgPT0gIkhFQVJUIC0gTUlORCIgfiBuZWdhdGl2ZSArIHplcm8pLAogICAgICAgICBhZ2VfZ3JvdXAgPSByZWNvZGVfZmFjdG9yKGFnZV9ncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR1bHRzIiA9ICJBZHVsdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGlsZHJlbjc5IiA9ICJDaGlsZHJlbiwgNy05eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaWxkcmVuNDYiID0gIkNoaWxkcmVuLCA0LTZ5IikpCmBgYAoKYGBge3J9CiB0YWJsZTQuMTEgPC0gZGlmZnNjb3Jlc190YWIgJT4lCiAgbXV0YXRlX2F0KHZhcnMobmVnYXRpdmUsIHBvc2l0aXZlLCB6ZXJvLCBtb2RhbCksCiAgICAgICAgICAgIGZ1bnMocGFzdGUwKHJvdW5kKC4sIDIpICogMTAwLCAiJSIpKSkgJT4lCiAgc2VsZWN0KGFnZV9ncm91cCwgc3R1ZHksIG5lZ2F0aXZlLCB6ZXJvLCBwb3NpdGl2ZSwgbW9kYWwpICU+JSAKICByZW5hbWUoYEFnZSBncm91cGAgPSBhZ2VfZ3JvdXAsIAogICAgICAgICBTdHVkeSA9IHN0dWR5LAogICAgICAgICAjIGA8IDBgID0gbmVnYXRpdmUsIGAwYCA9IHplcm8sIGA+IDBgID0gcG9zaXRpdmUsCiAgICAgICAgIGBNb2RhbCBhZHVsdCB0ZW5kZW5jeWAgPSBtb2RhbCkgJT4lCiAga2FibGUoZGlnaXRzID0gMiwKICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDQuMTE6IFBlcmNlbnRhZ2Ugb2YgZGlmZmVyZW5jZSBzY29yZXMgdGhhdCB3ZXJlIG5lZ2F0aXZlLCB6ZXJvLCBvciBwb3NpdGl2ZSBmb3IgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgYWNyb3NzIGFsbCBzdHVkaWVzIGFuZCBzYW1wbGVzLiBGb3IgZWFjaCBzYW1wbGUsIHRoZSBmaW5hbCBjb2x1bW4gZ2l2ZXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGFyZ2V0IGNoYXJhY3RlciBhc3Nlc3NtZW50cyB0aGF0IHdlcmUgZWl0aGVyIHplcm8gb3Igd2VudCBpbiB0aGUgbW9kYWwgZGlyZWN0aW9uIG9mIGFzeW1tZXRyeSBhbW9uZyBhZHVsdHMgZm9yIHRoYXQgcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChwb3NpdGl2ZSBvciBCT0RZIC0gSEVBUlQ7IG5lZ2F0aXZlIGZvciBCT0RZIC0gTUlORCBhbmQgSEVBUlQgLSBNSU5EKS4iKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgY29sbGFwc2Vfcm93cygxKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIC0gSEVBUlQiLCAxLCAxMSkgJT4lCiAgZ3JvdXBfcm93cygiQk9EWSAtIE1JTkQiLCAxMiwgMjIpICU+JQogIGdyb3VwX3Jvd3MoIkhFQVJUIC0gTUlORCIsIDIzLCAzMykgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDIsICJEaXJlY3Rpb24gb2YgYXN5bW1ldHJ5IiA9IDMsICIgIiA9IDEpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KdGFibGU0LjExCmBgYAoKU3R1ZGllcyB3aXRoIGFkdWx0cyB1c2luZyBkaWZmZXJlbnQgZXhwZXJpbWVudGFsIGFwcHJvYWNoZXMgKGFza2luZyBwYXJ0aWNpcGFudHMgdG8gYXNzZXNzIHRoZSBtZW50YWwgbGl2ZXMgb2YgZWRnZSBjYXNlcyBvciBhIGRpdmVyc2UgcmFuZ2Ugb2YgdGFyZ2V0IGNoYXJhY3RlcnMpLCB0aGVpciBiZXR3ZWVuLSB2cy4gd2l0aGluLXN1YmplY3RzIGRlc2lnbiwgdGhlIG51bWJlciBhbmQgcmFuZ2Ugb2YgbWVudGFsIGNhcGFjaXRpZXMgaW5jbHVkZWQsIGFuZCB0aGUgcmVzcG9uc2Ugb3B0aW9ucyBhdmFpbGFibGUgdG8gcGFydGljaXBhbnRzIGFsbCBjb252ZXJnZWQgdG8gc3VnZ2VzdCBhIHJvYnVzdCBoaWVyYXJjaGljYWwgc3RydWN0dXJlIGFtb25nIEJPRFksIEhFQVJULCBhbmQgTUlORCBhbW9uZyBVUyBhZHVsdHM6IEJPRFkgYW5kIE1JTkQgYXBwZWFyIHRvIGJlIG1vcmUgZnVuZGFtZW50YWwgb3IgImJhc2ljIiBjb25jZXB0dWFsIHVuaXRzIHRoYW4gSEVBUlQgaW4gYWR1bHRzJyByZXByZXNlbnRhdGlvbnMgb2YgbWVudGFsIGxpZmUuIAoKTXkgZXZpZGVuY2UgZm9yIHRoaXMgY2xhaW0gaXMgdGhhdCwgYWNyb3NzIGFsbCBzZXZlbiBzdHVkaWVzIHdpdGggYWR1bHRzLCBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBlbmRvcnNlZCB0aGUgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIG9mIHRoZSBCT0RZIGFuZCB0aGUgcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzIG9mIHRoZSBNSU5EIGF0IGxlYXN0IGFzIHN0cm9uZ2x5LCBvZnRlbiBtb3JlIHN0cm9uZ2x5LCBhbmQgYWxtb3N0IG5ldmVyIGxlc3Mgc3Ryb25nbHksIHRoYW4gdGhlIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzIG9mIHRoZSBIRUFSVC4gU2VlIEZpZ3VyZSA0LjEwIGZvciBhIHN1bW1hcnkgb2YgZGlmZmVyZW5jZSBzY29yZXMgaW4gYWxsIHN0dWRpZXMgKHBhbmVsIEEpIGFuZCBpbnRlcmNlcHRzIGZyb20gcmVncmVzc2lvbiBtb2RlbHMgY29tcGFyaW5nIHRoZXNlIGRpZmZlcmVuY2Ugc2NvcmVzIHRvIHplcm8gKHBhZW5sIEIpLgoKVGhlc2UgdGVuZGVuY2llcyB3ZXJlIHN0cm9uZyBhbmQgc3RyaWtpbmdseSByZWxpYWJsZTogQWNyb3NzIHN0dWRpZXMsIGByIG1vZGFsX3BlcmNlbnRfZnVuKHRhYmxlID0gZGlmZnNjb3Jlc190YWIsIHdoaWNoX3BhaXIgPSAiQk9EWSAtIEhFQVJUIiwgd2hpY2hfYWdlX2dyb3VwID0gIkFkdWx0cyIpYCBvZiBpbmRpdmlkdWFsIGFkdWx0cycgYXNzZXNzbWVudHMgb2YgdGFyZ2V0IGNoYXJhY3RlcnMgeWllbGRlZCBfQk9EWV8gc2NvcmVzIHRoYXQgd2VyZSBhdCBsZWFzdCBhcyBoaWdoIG9yIGhpZ2hlciB0aGFuIF9IRUFSVF8gc2NvcmVzLCBhbmQgZnVsbHkgYHIgbW9kYWxfcGVyY2VudF9mdW4odGFibGUgPSBkaWZmc2NvcmVzX3RhYiwgd2hpY2hfcGFpciA9ICJIRUFSVCAtIE1JTkQiLCB3aGljaF9hZ2VfZ3JvdXAgPSAiQWR1bHRzIilgIHlpZWxkZWQgX01JTkRfIHNjb3JlcyB0aGF0IHdlcmUgYXQgbGVhc3QgYXMgaGlnaCBvciBoaWdoZXIgdGhhbiBfSEVBUlRfIHNjb3JlcyAoc2VlIFRhYmxlIDQuMTEsICJCT0RZIC0gSEVBUlQiIGFuZCAiSEVBUlQgLSBNSU5EIiBzZWN0aW9uczsgc2VlIGFsc28gRmlndXJlIDQuMTAsIHBhbmVsIEEsIGxlZnRtb3N0IGFuZCByaWdodG1vc3QgY29sdW1ucykuIFRoaXMgaXMgYSByZW1hcmthYmxlIGxldmVsIG9mIGNvbnNpc3RlbmN5IGFjcm9zcyBwYXJ0aWNpcGFudHMgYW5kIHN0dWRpZXM6IEV2ZW4gdGhvdWdoIHBhcnRpY2lwYW50cyB3ZXJlIHJlc3BvbmRpbmcgdG8gcXVlc3Rpb25zIGFib3V0IGluZGl2aWR1YWwgbWVudGFsIGNhcGFjaXRpZXMgcHJlc2VudGVkIGluIGEgcmFuZG9tIG9yZGVyLCB3aXRoIG5vIGV4cGxpY2l0IGluZGljYXRpb24gb2Ygd2hpY2ggY2FwYWNpdGllcyB3b3VsZCBiZSBncm91cGVkIHRvZ2V0aGVyIHRvIGZvcm0gInNjYWxlcyIgaW4gdGhlc2UgYW5hbHlzZXMsIGFuZCBldmVuIHRob3VnaCBkaWZmZXJlbnQgcGFydGljaXBhbnRzIHdlcmUgYXNzZXNzaW5nIGRpZmZlcmVudCB0YXJnZXQgY2hhcmFjdGVycyBhbmQgYnJpbmluZyB0aGVpciBvd24gcGVyc29uYWwgZXhwZXJpZW5jZXMgd2l0aCBhbmQgYmVsaWVmcyBhYm91dCB0aGVzZSBjaGFyYWN0ZXJzIHRvIGJlYXIgb24gdGhlaXIgYXNzZXNzbWVudHMsIHZpcnR1YWxseSBfbm9fIHBhcnRpY2lwYW50cyBhbnN3ZXJlZCB0aGVzZSBxdWVzdGlvbnMgaW4gc3VjaCBhIHdheSBhcyB0byBpbmRpY2F0ZSB0aGF0IGFueSBvZiB0aGUgdGFyZ2V0IGNoYXJhY3RlcnMgaW5jbHVkZWQgaW4gdGhlc2Ugc3R1ZGllcyBoYWQgbW9yZSBpbiB0aGUgd2F5IG9mIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzIChIRUFSVCkgdGhhbiBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMgKEJPRFkpIG9yIHBlcmNlcHR1YWwtY29nbml0aXZlIGFiaWxpdGllcy4gKEluZGVlZCwgb25seSBwYXJ0aWNwaWFudHMgd2hvIGdyYW50ZWQgYXQgbGVhc3QgbW9kZXJhdGUgYW1vdW50cyBvZiBfYm90aF8gQk9EWSBhbmQgTUlORCB0byBhIHRhcmdldCBjaGFyYWN0ZXIgZ3JhbnRlZCBhbnkgc3Vic3RhbnRpYWwgZGVncmVlIG9mIEhFQVJUIHRvIHRoaXMgY2hhcmFjdGVyOyBzZWUgW1hYIEFQUEVORElYIEJdLikgSSB0YWtlIHRoZXNlIHJvYnVzdCBhc3ltbWV0cmllcyB0byBiZSBzdHJvbmcgZXZpZGVuY2Ugb2YgYSBoaWVyYXJjaGljYWwgb3JnYW5pemF0aW9uIG9mIGNvbmNlcHR1YWwgdW5pdHM6IEFtb25nIFVTIGFkdWx0cywgQk9EWSBhbmQgTUlORCBhcHBlYXIgdG8gZnVuY3Rpb24gYXMgbW9yZSAiYmFzaWMiIG9yICJmdW5kYW1lbnRhbCIgY29tcG9uZW50cyBvZiBtZW50YWwgbGlmZSB0aGFuIEhFQVJULiAKCkluIGJvdGggb2YgdGhlc2UgY2FzZXMsIHRoZXJlIHdlcmUgc29tZSBpbnRyaWd1aW5nIGhpbnRzIGZyb20gbXkgaG9saXN0aWMgdmlzdWFsaXphdGlvbnMgb2YgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyB0aGF0IGFkdWx0cyBtaWdodCBoYXZlIGJlZW4gcmVseWluZyBvbiBzb21lIHNvcnQgb2YgInRocmVzaG9sZCIgbW9kZWwgb2YgdGhlc2UgZGVwZW5kZW5jaWVzLCBzdWNoIHRoYXQgYSBiZWluZyBtdXN0IGhhdmUgYSBtaW5pbWFsIGRlZ3JlZSBvciBhbW91bnQgb2YgY2FwYWNpdGllcyBpbiB0aGUgbW9yZSBiYXNpYyBkb21haW4gKEJPRFkgb3IgTUlORCkgaW4gb3JkZXIgdG8gaGF2ZSBhbnkgZGVncmVlIG9yIGFtb3VudCBvZiBjYXBhY2l0aWVzIGluIHRoZSBIRUFSVCBkb21haW4uIE15IGV2aWRlbmNlIGZvciB0aGlzIHNwZWN1bGF0aXZlIGNsYWltIGlzIHRoYXQsIGFjcm9zcyBzdHVkaWVzLCB0aGVzZSB2aXN1YWxpemF0aW9ucyB0ZW5kZWQgdG8gZmVhdHVyZSBhIGxhcmdlIG51bWJlciBvZiBkYXRhcG9pbnRzIHRvd2FyZCB0aGUgImVkZ2VzIiBvZiB0aGUgcGxvdHMsIHJhdGhlciB0aGFuIHRvd2FyZCB0aGUgbWlkZGxlIG9mIHRoZSBwbG90LiBGb3IgZXhhbXBsZSwgaW4gdGhlICJlZGdlIGNhc2UiIHN0dWRpZXMgKFN0dWRpZXMgMWEtMWMsIDIsIGFuZCA0KSwgb25seSBhZHVsdHMgd2hvIGdyYW50ZWQgdGhlIGJlZXRsZSBvciB0aGUgcm9ib3QgYXQgbGVhc3QgYSBtb2RlcmF0ZSBkZWdyZWUgb2YgQk9EWSBhbmQgTUlORCBhYmlsaXRpZXMgdG8gdGhlIGJlZXRsZSBncmFudGVkIHRoYXQgY2hhcmFjdGVyIGFueSBIRUFSVCBhYmlsaXRpZXM7IGxpa2Vpd3NlLCBpbiB0aGUgImRpdmVyc2UgY2hhcmFjdGVycyIgc3R1ZGllcyAoU3R1ZGllcyAxZCBhbmQgMyksIG9ubHkgY2hhcmFjdGVycyB0aGF0IHdlcmUgKGluIHRoZSBhZ2dyZWdhdGUpIGdyYW50ZWQgYXQgbGVhc3QgbW9kZXJhdGUgZGVncmVlcyBvZiBCT0RZIGFuZCBNSU5EIGFiaWxsaXRpZXMgd2VyZSBncmFudGVkIGFueSBIRUFSVCBhYmlsaXRpZXMuIFRoaXMga2luZCBvZiBwYXR0ZXJuIGFwcGVhcnMgdG8gaGF2ZSBiZWVuIHNwZWNpZmljIHRvIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBCT0RZIHZzLiBIRUFSVCBhbmQgTUlORCB2cy4gSEVBUlQgKG5vdCBCT0RZIHZzLiBNSU5EKS4gQXMgSSBzcGVjdWxhdGVkIGluIHRoZSBkaXNjdXNzaW9uIG9mIGFkdWx0cycgcmVzdWx0cyBmb3IgaW5kaXZpZHVhbCBzdHVkaWVzLCB0aGlzIGNvdWxkIGJlIGV2aWRlbmNlIG9mIGFkdWx0cycgbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBiZWluZyBnb3Zlcm5lZCBieSBzb21lIHNvcnQgb2YgInRocmVzaG9sZCIgbW9kZWwsIGluIHdoaWNoIGF0dHJpYnV0aW9ucyBvZiBhbnkgc3Vic3RhbnRpYWwgYW1vdW50IG9mIEhFQVJUIGRlcGVuZCBvbiB0aGUgdGFyZ2V0IGNoYXJhY3RlciBoYXZpbmcgYSBjZXJ0YWluIGRlZ3JlZSBvZiBCT0RZIGFuZCBNSU5ELiBUaGlzIHdvdWxkIGJlIGFuIGludGVyZXN0aW5nIGxpbmUgb2YgaW5xdWlyeSBmb3IgZnV0dXJlIHJlc2VhcmNoLiAKCkluIGNvbnRyYXN0IHRvIHRoZSByb2J1c3QgYXN5bW1ldHJpZXMgaW4gYWR1bHRzJyBhdHRyaWJ1dGlvbnMgb2YgQk9EWSB2cy4gSEVBUlQgYW5kIE1JTkQgdnMuIEhFQVJULCB0aGVpciBhdHRyaWJ1dGlvbnMgb2YgdGhlIHR3byBtb3JlICJiYXNpYyIgY29uY2VwdHVhbCB1bml0c+KAlEJPRFkgYW5kIE1JTkTigJR3ZXJlIGxlc3Mgcm9idXN0bHkgYXN5bW1ldHJpY2FsLiBPbiB0aGUgd2hvbGUsIG1vc3QgYXNzZXNzbWVudHMgb2YgdGFyZ2V0IGNoYXJhY3RlcnMgeWllbGRlZCBfTUlORF8gc2NvcmVzIHRoYXQgd2VyZSBhdCBsZWFzdCBhcyBoaWdoIG9yIGhpZ2hlciB0aGFuIF9CT0RZXyBzY29yZXPigJRidXQgaW4gY29udHJhc3QgdG8gdGhpcyBtb2RhbCByZXNwb25zZSBhY2NvdW50aW5nIGZvciB0aGUgdmFzdCBtYWpvcml0eSBvZiBkYXRhIGluIHRoZSBvdGhlciBjb21wYXJpc29ucyBvZiBjb25jZXB0dWFsIHVuaXRzLCB0aGlzIHdhcyB0cnVlIGluIG9ubHkgYHIgbW9kYWxfcGVyY2VudF9mdW4odGFibGUgPSBkaWZmc2NvcmVzX3RhYiwgd2hpY2hfcGFpciA9ICJCT0RZIC0gTUlORCIsIHdoaWNoX2FnZV9ncm91cCA9ICJBZHVsdHMiKWAgYWNyb3NzIHN0dWRpZXMgKHNlZSBUYWJsZSA0LjExLCAiQk9EWSAtIE1JTkQiIHNlY3Rpb247IHNlZSBhbHNvIEZpZ3VyZSA0LjEwLCBwYW5lbCBBLCBjZW50ZXIgY29sdW1uKS4gSW4gc3R1ZGllcyB0aGF0IGZlYXR1cmVkICJlZGdlIGNhc2VzIiBhcyB0YXJnZXQgY2hhcmFjdGVycyAoU3R1ZGllcyAxYS0xYywgMiwgYW5kIDQpLCB0aGlzIGFzeW1tZXRyeSAoTUlORCBtb3JlIHRoYW4gQk9EWSkgdGVuZGVkIHRvIGJlIGxpbWl0ZWQgdG8gYXNzZXNzbWVudHMgb2YgdGhlIHJvYm90OyB0aGVyZSB3YXMgYSBmYWlyIGRlZ3JlZSBvZiB2YXJpYWJpbGl0eSBpbiB3aGV0aGVyIGluZGl2aWR1YWwgcGFydGljaXBhbnRzIGF0dHJpYnV0ZWQgbW9yZSBCT0RZIG9yIG1vcmUgTUlORCB0byB0aGUgYmVldGxlLCBhbmQgaW4gb25lIGNhc2UgKFN0dWR5IDQpIHRoZSBtZWFuIF9CT0RZXyBzY29yZSB3YXMgYWN0dWFsbHkgaGlnaGVyIHRoYW4gdGhlIG1lYW4gX01JTkRfIHNjb3JlIGZvciB0aGUgYmVldGxlIChzZWUgRmlndXJlIDQuMiwgcGFuZWxzIEEtQzsgRmlndXJlIDQuNSwgcGFuZWwgQTsgYW5kIEZpZ3VyZSA0LjksIHBhbmVsIEEpLiBMaWtld2lzZSwgaW4gc3R1ZGllcyB0aGF0IGZlYXR1cmVkIGEgd2lkZXIgcmFuZ2Ugb2YgImRpdmVyc2UgY2hhcmFjdGVycyIgKFN0dWR5IDFkIGFuZCBTdHVkeSAzKSwgb25seSB0ZWNobm9sb2dpY2FsICJiZWluZ3MiIHJlbGlhYmx5IHJlY2VpdmVkIGhpZ2hlciBfTUlORF8gdGhhbiBfQk9EWV8gc2NvcmVzIGZyb20gYWR1bHQgcGFydGljaXBhbnRzLCBhbmQgY2VydGFpbiBvdGhlciBiZWluZ3MgKGUuZy4sIGltbWF0dXJlIGh1bWFucywgc29tZSBub24taHVtYW4gYW5pbWFscykgdGVuZGVkIHRvIHJlY2VpdmUgaGlnaGVyIF9CT0RZXyB0aGFuIF9NSU5EXyBzY29yZXMgKHNlZSBGaWd1cmUgNC4yLCBwYW5lbCBEOyBhbmQgRmlndXJlIDQuNywgcGFuZWwgQSkuIFRha2VuIHRvZ2V0aGVyLCBJIGNvbnNpZGVyIHRoZXNlIGZpbmRpbmdzIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgbm8gZ2VuZXJhbCBoaWVyYXJjaGljYWwgcmVsYXRpb25zaGlwIGJldHdlZW4gQk9EWSBhbmQgTUlORCBpbiBVUyBhZHVsdHMnIGNvbmNlcHR1YWwgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlOiBJbnN0ZWFkLCBhZHVsdHMgYXBwZWFyIHRvIGFzc2VzcyBhIGJlaW5nJ3MgY2FwYWNpdHkgZm9yIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9uIHNvbWV3aGF0IGluZGVwZW5kZW50bHkgb2YgaXRzIGNhcGFjaXRpZXMgZm9yIHBlcmNlcHRpb24gYW5kIGNvZ25pdGlvbiwgYW5kIGNvbnNpZGVyIGl0IHF1aXRlIHBsYXVzaWJsZSBmb3IgZGlmZmVyZW50IGJlaW5ncyBpbiB0aGUgd29ybGQgdG8gaGF2ZSByZWxhdGl2ZWx5IG1vcmUgb3IgbGVzcyBvZiBlaXRoZXIgb2YgdGhlc2UgYXNwZWN0cyBvZiBtZW50YWwgbGlmZS4KCk9mIGNvdXJzZSwgbm9uZSBvZiB0aGVzZSBjb25jZXB0dWFsIHVuaXRzIGFwcGVhcnMgdG8gYmUgYXNzZXNzZWQgX2NvbXBsZXRlbHlfIGluZGVwZW5kZW50bHkgb2YgdGhlIG90aGVyczogQXR0cmlidXRpb25zIG9mIG1lbnRhbCBjYXBhY2l0aWVzIGluIGVhY2ggb2YgdGhlc2UgZG9tYWlucyB3ZXJlIGF0IGxlYXN0IG1vZGVyYXRlbHkgY29ycmVsYXRlZCB3aXRoIGVhY2ggb3RoZXIgKHNlZSBGaWd1cmUgNC4xMCwgcGFuZWwgQykuIEZvciBldmVyeSBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMsIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgdHdvIHJlbGV2YW50IHNjYWxlcyB3ZXJlIGFsbW9zdCBhbHdheXMgcG9zaXRpdmUgaW4gYWR1bHQgc2FtcGxlcyAod2l0aCB0aGUgc2luZ2xlIGV4Y2VwdGlvbiBvZiB0aGUgYWR1bHQgc2FtcGxlIGluIFN0dWR5IDIpLiBUaGUgY29ycmVsYXRpb25zIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzIGFwcGVhciB0byBoYXZlIGJlZW4gcGFydGljdWxhcmx5IHN0cm9uZyAoYW5kIHJlbGlhYmxlIGFjcm9zcyBzdHVkaWVzKSBhbW9uZyBhZHVsdHM7IHRoaXMgcHJpdmlsZWdlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiBCT0RZIGFuZCBIRUFSVCBtaWdodCBoYXZlIGl0cyByb290cyBpbiBlYXJseSBjaGlsZGhvb2TigJRhIHBvaW50IGluIGRldmVsb3BtZW50IHdoZW4gY2hpbGRyZW4gaW4gdGhpcyBjdWx0dXJhbCBjb250ZXh0IGZhaWwgdG8gZHJhdyBhIHNoYXJwIGRpc3RpbmN0aW9uIGJldHdlZW4gcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIGFuZCBzb2NpYWwtZW1vdGlvbmFsIGFiaWx0aWllcyAoYXMgcmV2ZWFsZWQgYnkgdGhlIGFuYWx5c2VzIHByZXNlbnRlZCBpbiBDaGFwdGVyIElJSTsgc2VlIGFsc28gQXBwZW5kaXggQSBmb3IgYW4gYWx0ZXJuYXRpdmUgc2V0IG9mIGV4cGxvcmF0b3J5IGZhY3RvciBhbmFseXNlcyB1c2luZyBhbiBvYmxpcXVlIHJvdGF0aW9uLCB3aGljaCBhbGxvd3MgZm9yIGFuIGFzc2Vzc21lbnQgb2YgdGhlIGNvcnJlbGF0aW9ucyBfYmV0d2VlbiBmYWN0b3JzIHRoZW1zZWx2ZXNfIHJhdGhlciB0aGFuIGFuIGFzc2Vzc21lbnQgb2YgY29ycmVsYXRpb25zIGJldHdlZW4gcGFydGljaXBhbnRzJyBzY29yZXMgb24gdGhlc2UgZmFjdG9ycykuIE1vcmUgZ2VuZXJhbGx5LCB0aGUgdWJpcXVpdG91cyBwb3NpdGl2ZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gYXR0cmlidXRpb25zIG9mIEJPRFksIEhFQVJULCBhbmQgTUlORCBhcmUsIGluIG15IHZpZXcsIGV2aWRlbmNlIHRoYXQgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIGFyZSBpbmRlZWQgcGFydCBvZiB0aGUgc2FtZSAiY29uY2VwdCIgb2YgbWVudGFsIGxpZmUuCgpJdCB3b3VsZCBiZSBmYXNjaW5hdGluZyB0byBleHBsb3JlIHRoZSBuYXR1cmUgYW5kIGltcGxpY2F0aW9ucyBvZiB0aGUgaGllcmFyY2hpY2FsIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBCT0RZLCBIRUFSVCwgYW5kIE1JTkQgaW4gZnV0dXJlIHdvcmsuIEluIHBhcnRpY3VsYXIsIGRvIGFkdWx0cycgYXNzZXNzbWVudHMgcmVmbGVjdCB0aGVpciBwZXJjZXB0aW9ucyBvZiB0aGUgY28tb2NjdXJlbmNlIG9mIG1lbnRhbCBjYXBhY2l0aWVzIGluIHRoZSB3b3JsZCwgb3IgbWlnaHQgdGhleSByZWZsZWN0IHNvbWV0aGluZyBkZWVwZXIgYWJvdXQgdGhlaXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgY2F1c2FsIHN5c3RlbXMgdGhhdCBnaXZlIHJpc2UgdG8gZGlmZmVyZW50IGFzcGVjdHMgb2YgbWVudGFsIGxpZmU/IEluIG90aGVyIHdvcmRzLCBkbyBhZHVsdHMgdGhpbmsgaXQgaXMgaW1wb3NzaWJsZSwgb3Igc2ltcGx5IHVubGlrZWx5LCBmb3IgYSBiZWluZyB0byBoYXZlIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzIHdpdGhvdXQgYmVpbmcgaW5zdGFudGlhdGVkIGluIGEgcGh5c2lvbG9naWNhbCBib2R5IChCT0RZKSwgb3Igd2l0aG91dCBoYXZpbmcgYWJpbGl0aWVzIHRvIHBlcmNlaXZlIGFuZCByZXByZXNlbnQgdGhlIGVudmlyb25tZW50IChNSU5EKT8gSG93IG1pZ2h0IHN1Y2ggaW50dWl0aXZlIHRoZW9yaWVzIGluZm9ybSwgb3IgYmUgaW5mb3JtZWQgYnksIHBlb3BsZSdzIHVuZGVyc3RhbmRpbmcgb2YgZXhjZXB0aW9uYWwgYmVpbmdzIHN1Y2ggYXMgInNvY2lhbCIgdGVjaG5vbG9naWVzIG9yIHNwaXJpdHVhbC9zdXBlcm5hdHVyYWwgYmVpbmdzICh3aG8gbGFjayBiaW9sb2dpY2FsIGJvZGllcyk/IE9uZSBpbnRyaWd1aW5nIHBvc3NpYmlsaXR5IGlzIHRoYXQgYWR1bHRzIGNvbnNpZGVyIHRoZSBhYmlsaXRpZXMgc3Vic3VtZWQgdW5kZXIgQk9EWSBhbmQgTUlORCB0byBiZSBfcHJlcmVxdWlzaXRlc18gZm9yIHRoZSBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyBhc3NvY2lhdGVkIHdpdGggSEVBUlQsIGFuZCBtaWdodCBoYXZlIGludHVpdGl2ZSB0aGVvcmllcyB0aGF0IHNwZWNpZnkgaG93IGFuZCB3aHkgQk9EWSBhbmQgTUlORCBhYmlsaXRpZXMgY29udHJpYnV0ZSB0byBlbW90aW9uYWwgZXhwZXJpZW5jZXMgYW5kIHNvY2lhbCBpbnRlcmFjdGlvbnMsIGFuZCBpbmZvcm0gYWR1bHRzJyBiZWxpZWZzIGFib3V0IHRoZSBleGlzdGVuY2UsIGFiaWxpaXRlcywgYW5kIGxpbWl0YXRpb25zIG9mIHN1Y2ggZXhjZXB0aW9uYWwgZW50aXRpZXMgYXMgInNvY2lhbCIgdGVjaG5vbG9naWVzIGFuZCBzcGlyaXR1YWwgb3Igc3VwZXJuYXR1cmFsIGJlaW5ncy4gSSBjb25zaWRlciB0aGlzIHRvIGJlIGFuIGVzcGVjaWFsbHkgaW50ZXJlc3RpbmcgZGlyZWN0aW9ucyBmb3IgZnV0dXJlIHdvcmsuCgpCZXlvbmQgZXN0YWJsaXNoaW5nIGFuIGFkdWx0IGVuZHBvaW50IGZvciB0aGlzIGFzcGVjdCBvZiBjb25jZXB0dWFsIHJlcHJlc2VudGF0aW9ucyBvZiBtZW50YWwgbGlmZSwgdGhlIHN0dWRpZXMgZGlzY3Vzc2VkIGluIHRoaXMgY2hhcHRlciBhbHNvIHByb3ZpZGUgYSBnbGltcHNlIG9mIHRoZSBkZXZlbG9wbWVudCBvZiByZWxhdGlvbnNoaXBzIGFtb25nIEJPRFksIEhFQVJULCBhbmQgTUlORCBvdmVyIHRoZSBjb3Vyc2Ugb2YgZWFybHkgYW5kIG1pZGRsZSBjaGlsZGhvb2QgKDQtOXkpLiAKCkZpcnN0LCBpdCBpcyB3b3J0aCBub3RpbmcgdGhhdCwgYWNyb3NzIHN0dWRpZXMsIEkgb2JzZXJ2ZWQgZ2VuZXJhbGx5IHBvc2l0aXZlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBjb25jZXB0dWFsIHVuaXRzICh0aGUgb25seSBleGNlcHRpb24gYmVpbmcgdGhlIEJPRFkgdnMuIE1JTkQgY29tcGFyaXNvbiBmb3Igb2xkZXIgY2hpbGRyZW4gaW4gU3R1ZHkgMjsgc2VlIEZpZ3VyZSA0LjEwLCBwYW5lbCBDKS4gQXMgd2l0aCBhZHVsdHMsIHRoaXMgcHJvdmlkZXMgc29tZSBldmlkZW5jZSB0aGF0IHRoZSBtZW50YWwgY2FwYWNpdGllcyBpbmNsdWRlZCBpbiB0aGVzZSBzdHVkaWVzIGFyZSBhbGwgcGFydCBvZiB0aGUgc2FtZSBjb25jZXB0dWFsIHNwYWNlIGV2ZW4gZm9yIHlvdW5nIGNoaWxkcmVuIChuYW1lbHksIGFuIHVuZGVyc3RhbmRpbmcgb2YgIm1lbnRhbCBsaWZlIikuCgpCZXlvbmQgdGhpcywgdGhlc2Ugc3R1ZGllcyBzdWdnZXN0IHRoYXQsIGJ5IHRoZSBwcmVzY2hvb2wgeWVhcnMsIGNoaWxkcmVuIGhhdmUgYW4gZW1lcmdpbmcgdW5kZXJzdGFuZGluZyBvZiB0aGUgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIG9mIHRoZSBCT0RZIGFuZCB0aGUgcGVyY2VwdHVhbC1jb2duaXRpdmUgYWJpbGl0aWVzIG9mIHRoZSBNSU5EIGFzIGJlaW5nIHNvbWVob3cgbW9yZSAiYmFzaWMiIHRoYW4gdGhlIHNvY2lhbC1lbW90aW9uYWwgYWJpbHRpaWVzIG9mIHRoZSBIRUFSVOKAlGJ1dCB0aGF0IHRoZXNlIGFzeW1tZXRyaWVzIGNvbnRpbnVlIGJlY29tZSBzdHJvbmdlciBhbmQgbW9yZSByb2J1c3Qgb3ZlciB0aGUgY291cnNlIG9mIGNoaWxkaG9vZCAoYW5kIHBlcmhhcHMgZXh0ZW5kaW5nIGludG8gYWRvbGVzZW5jZSkuIAoKTXkgZXZpZGVuY2UgZm9yIHRoaXMgY2xhaW0gY29tZXMgZnJvbSB0aGUgZmFjdCB0aGF0LCBhcyBhbW9uZyBhZHVsdHMsIGFtb25nIG1vc3Qgb2YgdGhlIGNoaWxkIHNhbXBsZXMgaW5jbHVkZWQgaW4gdGhlc2Ugc3R1ZGllcyBwYXJ0aWNpcGFudHMnIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgeWllbGRlZCBzdHJvbmdlciBfQk9EWV8gYW5kIF9NSU5EXyBzY29yZXMgdGhhbiBfSEVBUlRfIHNjb3JlcyAoc2VlIEZpZ3VyZSA0LjEwLCBwYW5lbHMgQSBhbmQgQikuIEhvd2V2ZXIsIHRoZXNlIHR3byBhc3ltbWV0cmllc+KAlHdoaWNoIEkgaGF2ZSB0YWtlbiB0byBiZSBzaWduYXR1cmVzIG9mIGhpZXJhcmNoaWNhbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gQk9EWSB2cy4gSEVBUlQgYW5kIGJldHdlZW4gSEVBUlQgdnMuIE1JTkTigJRhbGwgYXBwZWFyZWQgdG8gYmUgbXVjaCB3ZWFrZXIgaW4gc2l6ZSBhbmQgbGVzcyByZWxpYWJsZSBhY3Jvc3Mgc3R1ZGllcyB0aGFuIHRoZXkgd2VyZSBhbW9uZyBhZHVsdHMuIFRoaXMgd2FzIHRydWUgZXZlbiBhbW9uZyA3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuLCB3aG9zZSAiY29uY2VwdHVhbCB1bml0cyIgKEJPRFksIEhFQVJULCBhbmQgTUlORCkgb3RoZXJ3aXNlIGFwcGVhciB0byBiZSBxdWl0ZSBzaW1pbGFyIHRvIHRoYXQgb2YgYWR1bHRzIChzZWUgQ2hhcHRlciBJSUkpLiAKCk1lYW53aGlsZSwgaW4gdGhlIEJPRFkgdnMuIE1JTkQgY29tcGFyaXNvbiwgdGhlcmUgd2FzIHNvbWUgaW5kaWNhdGlvbiB0aGF0LCBlYXJseSBpbiBkZXZlbG9wbWVudCwgY2hpbGRyZW4gaG9sZCBpbnR1aXRpb25zIHRoYXQgZGlmZmVyIGZyb20gYWR1bHRzIG5vdCBvbmx5IGluIGRlZ3JlZSAoc2l6ZSBvZiBhc3ltbWV0cnkpIGJ1dCBwZXJoYXBzIGluIGtpbmQgKGRpcmVjdGlvbiBvZiBhc3ltbWV0cnkpLiBJbiBhbGwgc3R1ZGllcywgYWR1bHRzIHRlbmRlZCB0byBlbmRvcnNlIE1JTkQgc29tZXdoYXQgbW9yZSBzdHJvbmdseSB0aGFuIEJPRFksIGluIHRoZSBhZ2dyZWdhdGUgKHRob3VnaCBhcyBub3RlZCBlYXJsaWVyLCBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cycgZGlmZmVyZW5jZSBzY29yZXMgYXBwZWFycyB0byBiZSBjb250aW5nZW50IG9uIHRoZSB0YXJnZXQgY2hhcmFjdGVyIHRoZXkgd2VyZSBhc3NpZ25lZCB0byBhc3Nlc3MpLiBJbiBjb250cmFzdCwgaW4gaGFsZiBvZiB0aGUgY2hpbGQgc2FtcGxlcyBpbiB0aGVzZSBzdHVkaWVzICg3LSB0byA5LXllYXItb2xkIGNoaWxkcmVuIGluIFN0dWR5IDM7IDQtIHRvIDUteWVhci1vbGQgY2hpbGRyZW4gaW4gU3R1ZHkgNCkgdGhlcmUgd2FzIG5vIHN5c3RlbWF0aWMgYXN5bW1ldHJ5IGluIGNoaWxkcmVuJ3MgX0JPRFlfIHZzLiBfTUlORF8gc2NvcmVz4oCUYW5kIGluIG9uZSBzYW1wbGUsICg0LSB0byA2LXllYXItb2xkIGNoaWxkcmVuIGluIFN0dWR5IDMpLCBjaGlsZHJlbiBhY3R1YWxseSBkZW1vbnN0cmF0ZWQgdGhlIF9vcHBvc2l0ZV8gdGVuZGVuY3ksIGVuZG9yc2luZyBCT0RZIG1vcmUgc3Ryb25nbHksIG9uIGF2ZXJhZ2UsIHRoYW4gTUlORC4KCkFuYWx5c2VzIHRoYXQgdGFrZSBpbnRvIGFjY291bnQgY2hpbGRyZW4ncyBleGFjdCBhZ2Ugb2ZmZXIgZXZlbiBzdHJvbmdlciBldmlkZW5jZSB0aGF0IHRoZSBhc3ltbWV0cmllcyBiZXR3ZWVuIGNvbmNlcHR1YWwgdW5pdHMgZ2VuZXJhbGx5IGJlY29tZSBtb3JlIGFkdWx0LWxpa2XigJRib3RoIGluIHNpemUgYW5kIGluIGRpcmVjdGlvbuKAlHdpdGggaW5jcmVhc2luZyBhZ2UsIGJvdGggYW1vbmcgNy0gdG8gOS15ZWFyLW9sZHMgaW4gU3R1ZHkgMiBhbmQgYW1vbmcgNC0gdG8gOS15ZWFyLW9sZHMgaW4gU3R1ZHkgMyAoc2VlIFtYWCBBUFBFTkRJWCBCP10pLiAoQW5hbHlzZXMgb2YgU3R1ZHkgNCBwcm92aWRlcyBubyBldmlkZW5jZSBvZiBzaGlmdHMgdG93YXJkIGFkdWx0LWxpa2UgcGF0dGVybnMgYW1vbmcgNC0gdG8gNS15ZWFyLW9sZHMsIGJ1dCB0aGlzIGlzIG5vdCBzdXJwcmlzaW5nIGdpdmVuIHRoZSBzbWFsbGVyIHNhbXBsZSBzaXplIGFuZCBtb3JlIHJlc3RyaWN0ZWQgYWdlIHJhbmdlLikKCkluIGFkZGl0aW9uIHRvIHRoZSBhZ2UtcmVsYXRlZCBjaGFuZ2VzIGluIHNpemUgKGFuZCBwZXJoYXBzIGRpcmVjdGlvbikgb2YgdGhlIGFzeW1tZXRyaWVzIGFtb25nIEJPRFksIEhFQVJULCBhbmQgTUlORCBqdXN0IGRlc2NyaWJlZCwgdGhlcmUgYXJlIHNvbWUgaW5kaWNhdGlvbnMgdGhhdCB0aGVzZSBkZXZlbG9wbWVudGFsIGRpZmZlcmVuY2VzIG1heSBhbHNvIHJlZmxlY3QgY2hhbmdlcyBpbiB0aGUgZGVncmVlIG9mIGNvbnNlbnN1cyBhY3Jvc3MgaW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgd2l0aCBhZ2UuIFRoaXMgaXMgbW9zdCBzdHJpa2luZyBmb3IgdGhlIEJPRFkgdnMuIEhFQVJUIGFuZCBIRUFSVCB2cy4gTUlORCBjb21wYXJpc29uczogSW4gY29udHJhc3QgdG8gdGhlIHN0cm9uZyBjb25zZW5zdXMgYW1vbmcgYWR1bHRzIGluIHRoZSBkaXJlY3Rpb24gb2YgYXN5bW1ldHJ5IGZvciB0aGVzZSB0d28gcGFpcnMgb2YgY29uY2VwdHVhbCB1bml0cyAod2l0aCBgciBtb2RhbF9wZXJjZW50X2Z1bih0YWJsZSA9IGRpZmZzY29yZXNfdGFiLCB3aGljaF9wYWlyID0gYygiQk9EWSAtIEhFQVJUIiwgIkhFQVJUIC0gTUlORCIpLCB3aGljaF9hZ2VfZ3JvdXAgPSAiQWR1bHRzIilgIG9mIGluZGl2aWR1YWwgYXNzZXNzbWVudHMgb2YgdGFyZ2V0IGNoYXJhY3RlcnMgZGVtb25zdHJhdGluZyB0aGUgbW9kYWwgYWR1bHQgcGF0dGVybiBvZiBhc3ltbWV0cnk7IHNlZSBkaXNjdXNzaW9uIGluIHByZXZpb3VzIHBhcmFncmFwaHMpLCBhY3Jvc3Mgc3R1ZGllcyBvbmx5IGByIG1vZGFsX3BlcmNlbnRfZnVuKHRhYmxlID0gZGlmZnNjb3Jlc190YWIsIHdoaWNoX3BhaXIgPSBjKCJCT0RZIC0gSEVBUlQiLCAiSEVBUlQgLSBNSU5EIiksIHdoaWNoX2FnZV9ncm91cCA9ICJDaGlsZHJlbiwgNy05eSIpYCBvZiBhc2Vzc21lbnRzIGFtb25nIG9sZGVyIGNoaWxkcmVuIGFuZCBgciBtb2RhbF9wZXJjZW50X2Z1bih0YWJsZSA9IGRpZmZzY29yZXNfdGFiLCB3aGljaF9wYWlyID0gYygiQk9EWSAtIEhFQVJUIiwgIkhFQVJUIC0gTUlORCIpLCB3aGljaF9hZ2VfZ3JvdXAgPSAiQ2hpbGRyZW4sIDQtNnkiKWAgYW1vbmcgeW91bmdlciBjaGlsZHJlbiBjb25mb3JtZWQgdG8gdGhlIGFkdWx0IHBhdHRlcm4gb2YgYXN5bW1ldHJ5LiAoU2VlIGFsc28gRmlndXJlIDQuMTAsIHBhbmVsIEEsIGZvciBkaXN0cmlidXRpb25zIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIHdpdGhpbiBlYWNoIG9mIHRoZSBjaGlsZCBzYW1wbGVzLikgCgpUYWtlbiB0b2dldGhlciwgdGhpcyBzZXQgb2Ygb2JzZXJ2YXRpb25zIG9mIGRpZmZlcmVuY2VzIGFjcm9zcyBkaWZmZXJlbnQgYWdlIGdyb3VwcyBzdWdnZXN0IHRoYXQgZGV2ZWxvcG1lbnQgaW4gdGhlIG9yZ2FuaXphdGlvbiBvZiB0aGUgY29uY2VwdHVhbCB1bml0cyBJIGhhdmUgY2FsbGVkIEJPRFksIEhFQVJULCBhbmQgTUlORCBtYXkgaW52b2x2ZSBhdCBsZWFzdCB0aHJlZSBraW5kcyBvZiBjaGFuZ2VzOiAoMSkgSW5jcmVhc2VzIGluIHRoZSBfc2l6ZV8gb2YgdGhlc2UgYXN5bW1ldHJpZXMgKGkuZS4sIHRoZSBleHRyZW1lbmVzcyBvciBzdHJpY3RuZXNzIG9mIHRoZXNlIGhpZXJhcmNoaWNhbCByZWxhdGlvbnNoaXBzKTsgKDIpIENoYW5nZXMgaW4gdGhlIF9kaXJlY3Rpb25fIG9mIHNvbWUgb2YgdGhlc2UgYXN5bW1ldHJpZXMgKG5hbWVseSwgdGhlIHJlbGF0aXZlICJiYXNpYy1uZXNzIiBvZiBCT0RZIHZzLiBNSU5EOyBhbmQgKDMpIEluY3JlYXNlcyBpbiB0aGUgZGVncmVlIG9mIF9jb25zZW5zdXNfIGFjcm9zcyBpbmRpdmlkdWFscyBpbiB3aGV0aGVyIEJPRFkgYW5kL29yIE1JTkQgYXJlIHRyZWF0ZWQgYXMgbW9yZSBiYXNpYyB0aGFuIEhFQVJULgoKCiMgQ2hhcHRlciBjb25jbHVzaW9uCgpJbiB0aGlzIGNoYXB0ZXIsIEkgZXhwbG9yZWQgYSBzZWNvbmQgYXNwZWN0IG9mIGNvbmNlcHR1YWwgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlIGFtb25nIFVTIGNoaWxkcmVuIGFuZCBhZHVsdHM6IFRoZSBfcmVsYXRpb25hbCBvcmdhbml6YXRpb25fIG9mIHRoZSB0aHJlZSBjb25jZXB0dWFsIHVuaXRz4oCUQk9EWSwgSEVBUlQsIGFuZCBNSU5E4oCUdGhhdCBzZWVtIHRvIGFuY2hvciBhZHVsdHMnIGFuZCBvbGRlciBjaGlsZHJlbidzIHVuZGVyc3RhbmRpbmcgb2YgbWVudGFsIGxpZmUsIGFzIGlkZW50aWZpZWQgaW4gQ2hhcHRlciBJSUkuIAoKU3R1ZGllcyAxLTQgYXJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZm9sbG93aW5nIHRoZW9yeTogQnkgdGhlIHByZXNjaG9vbCB5ZWFycywgVVMgY2hpbGRyZW4gdHJlYXQgcGh5c2lvbG9naWNhbCBzZW5zYXRpb25zIChCT0RZKSBhcyBwYXJ0aWN1bGFybHkgYmFzaWMgb3IgZnVuZGFtZW50YWwgYXNwZWN0cyBvZiBtZW50YWwgbGlmZSwgYW5kIHRoZXkgcXVpY2tseSBjb21lIHRvIHNlZSBwZXJjZXB0dWFsLWNvZ25pdGl2ZSBhYmlsaXRpZXMgKE1JTkQpIGFzIHJvdWdobHkgZXF1YWxseSAiYmFzaWMuIiBJbiBjb250cmFzdCwgdGhlIHNvY2lhbC1lbW90aW9uYWwgYWJpbGl0aWVzIG9mIHRoZSBIRUFSVCBhcmUgcGVyY2VpdmVkIHRvIGJlIGxlc3MgYmFzaWMsIGkuZS4sIHRvIG9jY3VweSBhIGRpZmZlcmVudCBwb3NpdGlvbiBpbiB0aGUgaGllcmFyY2hpY2FsIHN0cnVjdHVyZSB0aGF0IGNoYXJhY3Rlcml6ZXMgdGhpcyBjb25jZXB0dWFsIGRvbWFpbi4gT3ZlciB0aGUgY291cnNlIG9mIGNoaWxkaG9vZOKAlGFuZCBleHRlbmRpbmcgYmV5b25kIHRoZSBvbGRlc3Qgbm9uLWFkdWx0IHNhbXBsZSBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCBzdHVkZW50cyAoNy05eSnigJR0aGVzZSBoaWVyYXJjaGljYWwgcmVsYXRpb25zaGlwcyBiZWNvbWUgaW5jcmVhc2luZ2x5IHN0YXJrLCBhcHBseWluZyBtb3JlIHVuaXZlcnNhbGx5IHRvIGFueSBraW5kIG9mICJiZWluZyIgaW4gdGhlIHdvcmxkLCBhbmQgdGhlIGRlZ3JlZSBvZiBjb25zZW5zdXMgYWNyb3NzIGluZGl2ZGl1YWxzIGluY3JlYXNlcy4gSW4gaXRzICJtYXR1cmUiIHN0YXRlLCB0aGlzIGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmUgYWRtaXRzIG9mIHZpcnV0YWxseSBubyBleGNlcHRpb25zOiBJdCBnb3Zlcm5zIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgdG8gYWxsIGtpbmRzIG9mIHRhcmdldCBlbnRpdGllcyBhbW9uZyBhbGwgcGFydGljaXBhbnRzLiBSZWdhcmRsZXNzIG9mIHRoZSBkZWdyZWUgdG8gd2hpY2ggYSBwZXJzb24gYXR0cmlidXRlcyBhbnkgcGFydGljdWxhciBtZW50YWwgY2FwYWNpdHkgdG8gYW55IHBhcnRpY3VsYXIgYmVpbmcgaW4gdGhlIHdvcmxkLCBVUyBhZHVsdHMgdmlydHVhbGx5IG5ldmVyIHZpb2xhdGUgdGhlIHJ1bGUgdGhhdCBpbiBvcmRlciB0byBoYXZlIGFueSBzb2NpYWwtZW1vdGlvbmFsIGFiaWxpdGllcyAoSEVBUlQpLCBhIGJlaW5nIG11c3QgYWxzbyBoYXZlIHNvbWUgZGVncmVlIG9mIHBoeXNpb2xvZ2ljYWwgc2Vuc2F0aW9ucyAoQk9EWSkgYW5kIHBlcmNlcHR1YWwtY29nbml0aXZlIGFiaWxpdGllcyAoTUlORCkuIFRoZSByZS1hbmFseXNlcyBkaXNjdXNzZWQgaW4gdGhpcyBjaGFwdGVyIGZvcm1lZCB0aGUgYmFzaXMgb2YgdGhpcyB0aGVvcnkgYW5kIGxheSB0aGUgZm91bmRhdGlvbiBmb3IgZnV0dXJlIGNvbmZpcm1hdG9yeSB0ZXN0cyBhbmQgZXh0ZW5zaW9ucyBvZiB0aGlzIHRoZW9yeS4gCgpJbiB0aGUgbmV4dCBjaGFwdGVyLCBJIGFwcGx5IHRoZSBzYW1lIGV4cGxvcmF0b3J5IHNwaXJpdCB0byBhIHRoaXJkIGFuZCBmaW5hbCBhc3BlY3Qgb2YgY29uY2VwdHVhbCByZXByZXNlbnRhdGlvbnMgb2YgbWVudGFsIGxpZmU6IHRoZSBhcHBsaWNhdGlvbiBvciBkZXBsb3ltZW50IG9mIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMgaW4gcmVhc29uaW5nIGFib3V0IHZhcmlvdXMga2luZHMgb2YgYmVpbmdzLgoKCg==